在這篇文章中介紹了單例模式有五種寫法:懶漢、餓漢、雙重檢驗鎖、靜態內部類、枚舉。如果涉及到反序列化創建對象時推薦使用枚舉的方式來實現單例,因為Enum能防止反序列化時重新創建新的對象。本文介紹 Enum 的使用方式。
public enum SingletonEnum{
INSTANCE;
}
通過SingletonEnum.INSTANCE來訪問實例,使用方式很簡單. 然而就這么簡單的話也沒有更多意義,具體的使用方式如下[1]:
public enum SingletonEnum {
INSTANCE;
int value;
// 這里我們可以自定義構造函數.
private SingletonEnum() {
value = 1;
System.out.println("INSTANCE now created!");
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
調用:
System.out.println("start get instance!");
SingletonEnum singleton = SingletonEnum.INSTANCE;
System.out.println(singleton.getValue());
singleton.setValue(2);
System.out.println(singleton.getValue());
輸入結果為:
start get instance!
INSTANCE now created!
1
2
上面的SingletonEnum的定義利用的enum是一種特殊的class.代碼中的第一行INSTANCE會被編譯器編譯為SingletonEnum本身的一個對象.當第一次訪問SingletonEnum.INSTANCE時會創建該對象,並且enum變量的創建是線程安全的.[2]