7

最近、私は気づきました、それは持つことが可能です:

class Test {
    public enum Season { WINTER, SPRING, SUMMER, FALL }
    Season field = Season.WINTER.SPRING; // why is WINTER.SPRING possible?
}

これには理由がありますか?

4

2 に答える 2

10

Javaでオブジェクトの静的メンバー(enumを含む)にアクセスすると、コンパイラーはオブジェクトをその静的タイプに効果的に置き換えます。より具体的には、

class ExampleClass {
    static int staticField;
    static void staticMethod() {
        ExampleClass example = new ExampleClass();
        example.staticField;     // Equivalent to ExampleClass.staticField;
        example.staticMethod();  // Equivalent to ExampleClass.staticMethod();
    }
}

同様に、列挙型は事実上「静的」であるため、;Season.WINTER.SPRINGと同等です。列挙型に置き換えられます。Season.SPRINGSeason.WINTERSeason

ちなみに、インスタンスから静的メンバーにアクセスすることは、非常に混乱する可能性があるため、お勧めしません。たとえば、を含むコードを見つけた場合、それがスリープ状態になっsomeThread.sleep()ていると信じ込ませる可能性があります。someThreadただし、sleep()は静的であるため、そのコードは実際にThread.sleep()は現在のスレッドをスリープ状態にする呼び出しを行っています。

于 2011-01-20T00:15:58.170 に答える
1

それは、列挙型が一種の特別なクラスだからです。Season.WINTER内のフィールドを見ると、たとえば次のようになります。

  for (Field field : Test.Season.WINTER.getClass().getFields())
   System.out.println(field);

出力として表示されます:

public static final TestEnum$Test$Season TestEnum$Test$Season.WINTER
public static final TestEnum$Test$Season TestEnum$Test$Season.SPRING
public static final TestEnum$Test$Season TestEnum$Test$Season.SUMMER
public static final TestEnum$Test$Season TestEnum$Test$Season.FALL

したがって、各列挙値は実際に は列挙クラスSeasonの静的定数でもあるため、Seasonの静的フィールドまたは他の列挙値(それ自体を含む)にアクセスできます。

ただし、Season.SPRINGのように、列挙型から直接列挙型の値にアクセスする方がおそらく良いでしょう。これは、コードを読んでいる人を混乱させる可能性が低く、単純だからです。

于 2011-01-20T00:17:33.917 に答える