最近,我注意到,有可能有:在Java中,为什么可以用另一个枚举常量限定枚举常量?
class Test {
public enum Season { WINTER, SPRING, SUMMER, FALL }
Season field = Season.WINTER.SPRING; // why is WINTER.SPRING possible?
}
是否有什么原因呢?
最近,我注意到,有可能有:在Java中,为什么可以用另一个枚举常量限定枚举常量?
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.SPRING可能更好,因为它更简单,并且不太可能会让读取代码的人感到困惑。
这相当于`WINTER |春天? – 2011-01-20 00:06:15
Season.WINTER.SPRING相当于Season.SPRING – 2011-01-20 00:08:32