2011-01-20 46 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可能更好,因爲它更簡單,並且不太可能會讓讀取代碼的人感到困惑。