Effective Java筆記第一章建立和銷燬物件第三節用私有構造器或者列舉型別強化Singleton屬性
Effective Java筆記第一章建立和銷燬物件
第三節用私有構造器或者列舉型別強化Singleton屬性
1.Singleton指僅僅被例項化一次的類。使類成為Singleton會使他的客戶端測試變得十分困難。Java1.5之前,實現Singleton有兩種方法,這兩種方法都要把構造器保持為私有的,並匯出公有的靜態成員變數,以便允許客戶端能訪問該類的唯一例項。
2.公有靜態成員是個final域
public class Demo1 {
//公有靜態成員final域
public static final Demo1 INSTANCE = new Demo1();
//私有構造防止例項化
private Demo1() {
}
public void leaveTheBuilding(){
}
public static void main(String[] args) {
Demo1 demo1 = Demo1.INSTANCE;
System.out.println(demo1);
Demo1 demo2 = Demo1.INSTANCE;
System.out.println(demo2);
}
優點:
1)私有構造器僅被呼叫一次,由於缺少公有的或者受保護的構造器,所以保證了類的全域性唯一性。
2)公有域方法的主要好處在於,組成類的成員的宣告很清楚地表明瞭這個類是個Singleton,公有的靜態域是final的,所以該域將總是包含相同的物件引用。
缺點:
享有特權的客戶端可以藉助AccessibleObject.setAccessible方法,通過反射機制呼叫私有構造器。如果要抵禦這種攻擊,可以修改構造器,讓他在被要求建立第二個例項的時候丟擲異常。
3.公有的成員是個靜態工廠方法
public class Demo2 {
//公有靜態成員final域
private static final Demo2 INSTANCE=new Demo2();
//私有構造防止例項化
private Demo2(){
}
//靜態工廠獲取物件
public static Demo2 getInstance(){
return INSTANCE;
}
public void leaveTheBuilding(){
}
public static void main(String[] args) {
Demo2 demo2 = Demo2.getInstance();
System.out.println(demo2);
Demo2 demo21 = Demo2.getInstance();
System.out.println(demo21);
}
}
工廠方法的優勢:
1)提供了靈活性,在不改變其API的前提下,我們可以改變該類是否應該為Singleton的想法。
2)優勢與泛型有關。
3)public域的方法比較簡單。
缺點:
容易被修改,比如改成為每個呼叫該方法的執行緒返回一個唯一例項。
4.包含單個元素的列舉型別
public enum Demo3 {
INSTANCE;
public void leaveThebuilding(){}
public static void main(String[] args) {
Demo3 demo3 = Demo3.INSTANCE;
System.out.println(demo3);
Demo3 demo31 = Demo3.INSTANCE;
System.out.println(demo31);
}
}
優勢:
1)與共有域方法相近,更加簡潔,無償提供了序列化機制,絕對防止多次例項化,雖然還沒推廣,但單元素的列舉型別已經成為實現Singleton的最佳方法。
相關文章
- Effective Java - 構造器私有、列舉和單例Java單例
- 建立和銷燬物件物件
- Java高階教程 - 建立和銷燬物件Java物件
- 建立和銷燬物件(一)物件
- 構造器引用和直接用new建立物件區別物件
- 【四】使用列舉和結構來建立值型別型別
- Java雙屬性列舉使用Java
- Java - Enum 列舉型別Java型別
- Effective Java - 靜態方法與構造器Java
- 列舉型別分享 第五節型別
- java中的列舉型別Java型別
- java基礎(十一) 列舉型別Java型別
- 物件導向--內部屬性型別物件型別
- PLC結構化文字(ST)——變數型別和變數屬性變數型別
- 列舉型別型別
- flutter 學習筆記【flutter 構造方法 TextField 屬性說明】Flutter筆記構造方法
- java中的列舉型別學習Java型別
- Java基礎教程(15)–列舉型別Java型別
- Python - 物件導向程式設計 - 公共屬性、保護屬性、私有屬性Python物件程式設計
- odoo欄位屬性列舉Odoo
- Java 學習筆記 二維陣列和物件陣列Java筆記陣列物件
- ENUM列舉型別型別
- 物件導向和構造器物件
- Java--構造器和構造方法Java構造方法
- 私有屬性
- Java物件為空時,不顯示該物件屬性,或者將null轉換為""Java物件Null
- JavaScript 推薦直接量建立陣列或者物件JavaScript陣列物件
- CSS筆記——屬性選擇器CSS筆記
- Java學習筆記【1】陣列的宣告和建立Java筆記陣列
- Java 列舉、JPA 和 PostgreSQL 列舉JavaSQL
- iOS學習筆記44 Swift(四)列舉和結構體iOS筆記Swift結構體
- Java列舉型別enum的詳解及使用Java型別
- 詳解.NET依賴注入中物件的建立與“銷燬”依賴注入物件
- JavaScript中的物件學習筆記(屬性操作)JavaScript物件筆記
- Singleton(單例)——物件建立型模式單例物件模式
- Python中訪問私有屬性和私有方法Python
- OC記憶體管理--物件的生成與銷燬記憶體物件
- JavaScript筆記5:計時器、物件、基本資料型別、引用資料型別JavaScript筆記物件資料型別