2011-01-20 156 views

回答

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(); 
    } 
} 

类似地,由于枚举是有效地 “静态”,Season.WINTER.SPRING相当于Season.SPRING; Season.WINTER被替换为枚举类型Season

作为一个方面说明,从实例访问静态成员是不鼓励的,因为它可能是相当混乱。例如,如果您看到一段包含someThread.sleep()的代码,则可能会欺骗您认为someThread已进入睡眠状态。但是,由于sleep()是静态的,因此该代码实际上调用了睡眠当前线程的Thread.sleep()

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.SPRING可能更好,因为它更简单,并且不太可能会让读取代码的人感到困惑。