3、用私有構造器或者列舉型別強化SIngleton屬性
結論
單元素的列舉型別已經成為實現Singleton的最佳方法
Singleton模式
常見的Singleton有兩種方式,第一種:
public class Elvis {
//被定義為final的,不可改變的
public static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
// This code would normally appear outside the class!
public static void main(String[] args) {
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}
}
第二種方式:
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
//定義為靜態方法
public static Elvis getInstance() {
return INSTANCE;
}
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
// This code would normally appear outside the class!
public static void main(String[] args) {
Elvis elvis = Elvis.getInstance();
elvis.leaveTheBuilding();
}
}
讓Singleton變成可序列化的
為了讓反序列化的時候只建立一個物件
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
private Object readResolve() {
// Return the one true Elvis and let the garbage collector
// take care of the Elvis impersonator.
return INSTANCE;
}
// This code would normally appear outside the class!
public static void main(String[] args) {
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}
}
使用列舉實現單例模式
無償提供了序列化的機制,絕對防止多次例項化
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
// This code would normally appear outside the class!
public static void main(String[] args) {
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}
}
相關文章
- Effective Java筆記第一章建立和銷燬物件第三節用私有構造器或者列舉型別強化Singleton屬性Java筆記物件型別
- Effective Java - 構造器私有、列舉和單例Java單例
- 列舉型別型別
- Java雙屬性列舉使用Java
- odoo欄位屬性列舉Odoo
- ENUM列舉型別型別
- 私有屬性
- Java - Enum 列舉型別Java型別
- PLC結構化文字(ST)——變數型別和變數屬性變數型別
- js可列舉屬性的遍歷JS
- 【四】使用列舉和結構來建立值型別型別
- java中的列舉型別Java型別
- JavaSE基礎:列舉型別Java型別
- Rust的列舉型別EnumRust型別
- 【C++】資料型別-列舉型C++資料型別
- TypeScript 中列舉型別的理解?應用場景?TypeScript型別
- 資料結構複習-01enum列舉型別資料結構型別
- 結構體-簡單列舉型別——植物與顏色結構體型別
- java基礎(十一) 列舉型別Java型別
- C++ 列舉型別介紹C++型別
- 列舉型別分享 第五節型別
- JPA不識別MySQL的列舉型別MySql型別
- OC中列舉寫法 以及 字串型別列舉實現探索字串型別
- 私有setter公有getter屬性
- java中的列舉型別學習Java型別
- Java基礎教程(15)–列舉型別Java型別
- 補充:C語言列舉型別C語言型別
- C語言 列舉資料型別C語言資料型別
- 簡單探討TypeScript 列舉型別TypeScript型別
- 列舉型別在JPA中的使用型別
- 類中的結構體或列舉等型別的前置宣告結構體型別
- Elasticsearch資料型別及其屬性Elasticsearch資料型別
- Python中的私有屬性與私有方法Python
- 宣告 NSString 型別的屬性,到底用 strong 還是 copy ?型別
- 物聯網學習教程—列舉型別型別
- PHP 列舉型別的管理與設計PHP型別
- 協議中的私有屬性協議
- Python - 物件導向程式設計 - 公共屬性、保護屬性、私有屬性Python物件程式設計
- Python中訪問私有屬性和私有方法Python