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的最佳方法。
相關文章
- 3、用私有構造器或者列舉型別強化SIngleton屬性型別
- 建議:用私有構造器或者列舉型別強化Singleton屬性。型別
- Effective Java - 構造器私有、列舉和單例Java單例
- 《effective java》讀書筆記1(建立和銷燬物件)Java筆記物件
- Effective Java讀書筆記三:建立和銷燬物件(1-7)Java筆記物件
- javascript基礎(物件,物件屬性,屬性基本和引用資料型別,字面量建立物件,垃圾回收,屬性的列舉)(十三)JavaScript物件資料型別
- 【Java基礎】建立和銷燬物件Java物件
- 建立和銷燬物件物件
- Java高階教程 - 建立和銷燬物件Java物件
- 構造器引用和直接用new建立物件區別物件
- 波哥學JAVA,定義類 宣告屬性 建立物件 例項化物件 物件呼叫屬性或者方法Java物件
- C#例項構造器,型別構造器 -筆記型別筆記
- Java高效程式設計之一【建立和銷燬物件】Java程式設計物件
- 【四】使用列舉和結構來建立值型別型別
- Effective Java讀書筆記二:列舉和註解(30-37)Java筆記
- java列舉型別Java型別
- java 列舉型別Java型別
- Java雙屬性列舉使用Java
- 修改物件私有屬性物件
- Java列舉型別的使用和原理Java型別
- 列舉型別分享 第五節型別
- Java - Enum 列舉型別Java型別
- Effective Java - 靜態方法與構造器Java
- java中的列舉型別Java型別
- javascript如何建立一個屬性節點物件JavaScript物件
- 深度分析 Java 的列舉型別:列舉的執行緒安全性及序列化問題Java型別執行緒
- effective java 第2條:遇到多個構造器引數時要考慮用構造器Java
- java基礎(十一) 列舉型別Java型別
- 列舉型別型別
- [C++]結構體、共同體和列舉型別C++結構體型別
- 獲取物件屬性型別、屬性名稱、屬性值的研究:反射和JEXL解析引擎物件型別反射
- PLC結構化文字(ST)——變數型別和變數屬性變數型別
- js 物件方法、類方法、原型方法的區別;私有屬性、公有屬性、公有靜態屬性的區別JS物件原型
- JavaScript私有屬性和靜態屬性JavaScript
- 物件導向--內部屬性型別物件型別
- 10-列舉型別和流型別
- java中的列舉型別學習Java型別
- Java基礎教程(15)–列舉型別Java型別