最近、私は気づきました、それは持つことが可能です:
class Test {
public enum Season { WINTER, SPRING, SUMMER, FALL }
Season field = Season.WINTER.SPRING; // why is WINTER.SPRING possible?
}
これには理由がありますか?
最近、私は気づきました、それは持つことが可能です:
class Test {
public enum Season { WINTER, SPRING, SUMMER, FALL }
Season field = Season.WINTER.SPRING; // why is WINTER.SPRING possible?
}
これには理由がありますか?
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.SPRING
Season.WINTER
Season
ちなみに、インスタンスから静的メンバーにアクセスすることは、非常に混乱する可能性があるため、お勧めしません。たとえば、を含むコードを見つけた場合、それがスリープ状態になっsomeThread.sleep()
ていると信じ込ませる可能性があります。someThread
ただし、sleep()
は静的であるため、そのコードは実際にThread.sleep()
は現在のスレッドをスリープ状態にする呼び出しを行っています。
それは、列挙型が一種の特別なクラスだからです。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のように、列挙型から直接列挙型の値にアクセスする方がおそらく良いでしょう。これは、コードを読んでいる人を混乱させる可能性が低く、単純だからです。