考慮以下枚舉建設:使用私有靜態成員構建枚舉在Java
public enum MyEnum {
ENUM_A(TYPE1), ENUM_B(TYPE2), ENUM_C(TYPE1), ENUM_D(TYPE1);
private static final String TYPE1 = "I am type 1";
private static final String TYPE2 = "This is type 2";
private final String type;
private MyEnum(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
上面的代碼不能編譯,因爲編譯器在抱怨illegal forward reference
。我有點理解爲什麼常量被定義爲之後的枚舉。
但是,不能移動枚舉定義上面/之前的常量,因爲枚舉定義必須是枚舉類中的第一個東西。
現在,如果代碼被更改爲:
public enum MyEnum {
ENUM_A(MyEnum.TYPE1), ENUM_B(MyEnum.TYPE2), ENUM_C(MyEnum.TYPE1), ENUM_D(MyEnum.TYPE1);
private static final String TYPE1 = "I am type 1";
private static final String TYPE2 = "This is type 2";
private final String type;
private MyEnum(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
然後,它似乎工作。
我的問題是:更改後的代碼是否帶有任何潛在的問題,即使它編譯?爲什麼更改可以解決編譯器檢查問題?這是否被認爲是一種標準方式或繞過未來可能修復的編譯器檢查的方式?
謝謝你的選擇。我沒有看到第一個和第二個不同的含義(語法除外)。但是你回答了我的問題,爲什麼它的工作。所以我選擇你作爲答案。 – user1589188
@ user1589188編譯器運行幾次,並且可以以任何順序初始化靜態變量值,除非您特別插入代碼的「靜態初始化塊」來控制值的初始化方式。所以你的例子之間的區別在於,第二,當你以「靜態方式」訪問變量時,它們保證被初始化。在第一個例子中,「保證」並不存在,當你引用它們時,它們可能會或可能不會被初始化(並且每次編譯時初始化順序都會改變) – geneSummons