最近,我注意到,有可能有:在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