在Java中,为什么可以用另一个枚举常量限定枚举常量?

Joh*_*oth 7 java enums qualified-name

最近,我注意到,有可能:

class Test {
    public enum Season { WINTER, SPRING, SUMMER, FALL }
    Season field = Season.WINTER.SPRING; // why is WINTER.SPRING possible?
}
Run Code Online (Sandbox Code Playgroud)

是否有一个原因?

ide*_*ide 10

当您使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

同样,由于枚举实际上是"静态的",Season.WINTER.SPRING相当于Season.SPRING; Season.WINTER被枚举类型替换Season.

作为旁注,不鼓励从实例访问静态成员,因为它可能非常混乱.例如,如果您看到包含的一段代码someThread.sleep(),您可能会被欺骗相信它会someThread被置于睡眠状态.但是,由于sleep()是静态的,该代码实际上正在调用Thread.sleep(),它会休眠当前线程.