我需要創建一個約300個值的枚舉,並有能力通過id(int)獲取其值。目前,我有這樣的:通過數字編號獲取枚舉的最佳方法
public enum Country {
DE(1), US(2), UK(3);
private int id;
private static Map<Integer, Country> idToCountry = new HashMap<>();
static {
for (Country c : Country.values()) {
idToCountry.put(c.id, c);
}
}
Country(int id) {
this.id = id;
}
public static Country getById(int id) {
return idToCountry.get(id);
}
}
該枚舉將被用到了很多,所以我不知道這是否是最佳的解決方案的性能,明智的。
我在讀http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html一遍又一遍,也沒有找到一個描述在什麼時候
static {
}
塊被稱爲部分,如果guaranted,這將是一次叫。那麼 - 是嗎?
靜態初始化塊被調用一次[當類被初始化時](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.7)。不保證被調用一次,但除非你使用類加載器做了一些奇特的事情。 –
完美,謝謝! @AndyTurner你會推薦另一種初始化方式嗎,還是我應該這樣做? – Michael
這看起來很好。我唯一要做的就是讓'id'' final'。 (還有'idToCountry'' final')。另一種方法是將它們放在一個數組中(假設你的ID是非負數且合理連續的) - 這可以讓你避免自動裝入'id'。 –