具有靜態欄位的列舉
如果你的列舉類需要有靜態欄位,請記住它們是在列舉值本身之後建立的。這意味著,以下程式碼將導致 NullPointerException
:
enum Example {
ONE(1), TWO(2);
static Map<String, Integer> integers = new HashMap<>();
private Example(int value) {
integers.put(this.name(), value);
}
}
解決此問題的可能方法:
enum Example {
ONE(1), TWO(2);
static Map<String, Integer> integers;
private Example(int value) {
putValue(this.name(), value);
}
private static void putValue(String name, int value) {
if (integers == null)
integers = new HashMap<>();
integers.put(name, value);
}
}
不要初始化靜態欄位:
enum Example {
ONE(1), TWO(2);
// after initialisisation integers is null!!
static Map<String, Integer> integers = null;
private Example(int value) {
putValue(this.name(), value);
}
private static void putValue(String name, int value) {
if (integers == null)
integers = new HashMap<>();
integers.put(name, value);
}
// !!this may lead to null poiner exception!!
public int getValue(){
return (Example.integers.get(this.name()));
}
}
initialisisation:
- 建立列舉值
- 作為副作用
putValue()
呼叫初始化整數
- 作為副作用
- 靜態值已設定
- integers = null; //在列舉後執行,因此整數內容丟失