最近,我注意到,可能有:
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 中访问对象(包括枚举)的静态成员时,编译器会有效地将对象替换为其静态类型。更具体地说,
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,因为它更简单且不太可能使阅读您的代码的人感到困惑。