3 回答

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
因?yàn)樗徐o態(tài)字段(包括表示枚舉值的靜態(tài)字段)都是按文本順序初始化的,而枚舉值始終位于其他字段之前,所以在初始化靜態(tài)字段之前會(huì)調(diào)用構(gòu)造函數(shù)。請(qǐng)注意,在您的類示例中,您沒有顯示ABBREV_MAP的初始化位置-如果在 SUNDAY 之后,則在初始化類時(shí)會(huì)出現(xiàn)異常。
是的,這有點(diǎn)痛苦,可能設(shè)計(jì)得更好。
但是,根據(jù)我的經(jīng)驗(yàn),通常的答案是static {}
在所有靜態(tài)初始化程序的末尾添加一個(gè)塊,然后在其中進(jìn)行所有靜態(tài)初始化,EnumSet.allOf
以獲取所有值。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
引用JLS,“枚舉主體聲明”部分:
沒有此規(guī)則,由于枚舉類型固有的初始化循環(huán)性,顯然合理的代碼將在運(yùn)行時(shí)失敗。(在具有“自類型”靜態(tài)字段的任何類中都存在圓度。)這是將失敗的那種代碼的示例:
enum Color {
RED, GREEN, BLUE;
static final Map<String,Color> colorMap = new HashMap<String,Color>();
Color() {
colorMap.put(toString(), this);
}
}
此枚舉類型的靜態(tài)初始化將引發(fā)NullPointerException,因?yàn)樵谶\(yùn)行枚舉常量的構(gòu)造函數(shù)時(shí),靜態(tài)變量colorMap未初始化。上面的限制確保了此類代碼不會(huì)編譯。
請(qǐng)注意,可以輕松地將示例重構(gòu)為正常工作:
enum Color {
RED, GREEN, BLUE;
static final Map<String,Color> colorMap = new HashMap<String,Color>();
static {
for (Color c : Color.values())
colorMap.put(c.toString(), c);
}
}
重構(gòu)版本顯然是正確的,因?yàn)殪o態(tài)初始化是自上而下進(jìn)行的。

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
也許這就是你想要的
public enum Day {
Sunday("Sun"),
Monday("Mon"),
Tuesday("Tue"),
Wednesday("Wed"),
Thursday("Thu"),
Friday("Fri"),
Saturday("Sat");
private static final Map<String, Day> ELEMENTS;
static {
Map<String, Day> elements = new HashMap<String, Day>();
for (Day value : values()) {
elements.put(value.element(), value);
}
ELEMENTS = Collections.unmodifiableMap(elements);
}
private final String abbr;
Day(String abbr) {
this.abbr = abbr;
}
public String element() {
return this.abbr;
}
public static Day elementOf(String abbr) {
return ELEMENTS.get(abbr);
}
}
添加回答
舉報(bào)