web-dev-qa-db-ja.com

静的列挙と非静的列挙

Javaの静的列挙型と非静的列挙型の違いは何ですか?両方の使用法は同じです。

それは正しいですか すべての静的なものは起動時にメモリにロードされ、非静的なものはオンデマンドでロードされます はいの場合、どの方法がより良いですか?一部のデータを常にメモリに保持するか、サーバーリソースを使用してそれらを毎回ロードしますか?

public class Test {

    public enum Enum1 {
        A, B
    }

    public static enum Enum2 {
        C, D
    }

    public static void main(String[] args) {
        Enum1 a = Enum1.A;
        Enum1 b = Enum1.B;

        Enum2 c = Enum2.C;
        Enum2 d = Enum2.D;
    }
}
71
AHHP

すべてのenumsは実質的にstaticです。ネストされた列挙型がある場合、static classとほぼ同じです。

すべてのクラスは遅延ロード(enumsまたはそれ以外)されますが、ロードされると、それらは一度にロードされます。つまり、いくつかの定数をロードすることはできませんが、他の定数はロードできません(クラス初期化の途中を除く)

Javaでは、特定の修飾子を暗黙的に許可して、常に宣言する必要を回避しています。つまり、修飾子を追加しても、同じことをより長い方法で記述する以外に何もする必要はありません。

のデフォルト修飾子

クラスフィールド/メソッド/ネストクラス-パッケージローカル、非ファイナル、非スタティック

列挙型およびネストされた列挙型-ローカル、最終、静的なパッケージ

インターフェイスフィールド-public static final

インターフェイスメソッド-public abstract

インターフェースのネストされたクラス-public static、非最終

注:staticenumのオプションですが、常に静的です。ただし、常に概念的にfinalであるにもかかわらず、finalを列挙型に設定することはできません(技術的には、定数のオーバーライドされた実装を持つサブクラスを持つことができます)

編集:staticenumを使用する必要があるのは、enumの値のimport staticのみです。ありがとう@ man910

133
Peter Lawrey

ネストされた列挙型の場合、デフォルトでは暗黙的にstaticです。

Java言語仕様 によると:

ネストされた列挙型は暗黙的に静的です。ネストされた列挙型を静的であると明示的に宣言することは許可されています。

18

すべてのEnumは暗黙的に静的であり、staticキーワードを記述する必要はありません。すべてのインターフェイスメソッドが暗黙的にパブリックである方法と同様に。

11
Elliott Hill

enumsinherently staticであるため、enumsstatic-keywordを使用する場合、必要はなく、違いもありません。

列挙型がクラスのメンバーである場合、暗黙的に静的です。

インターフェイスには、メンバー型の宣言を含めることができます。インターフェイスのメンバー型宣言は、暗黙的に静的でパブリックです。

Oracle Community Forum and This This

4
user3145373 ツ