Effective Java 學習 第三條 用私有構造器或者列舉型別強化Singleton屬性
阿新 • • 發佈:2019-01-26
綜述:Singleton即單例模式是指僅僅被例項化一次的類。比如工作管理員、檔案管理器、回收站、某些工具類等,這些類在程式中僅僅需要一個例項就足夠了,這個時候可以考慮使用單例模式。,以下介紹三種實現單例模式的方法:
1.餓漢式(類載入時建立例項)
特點:執行緒安全,不能防止反射攻擊,序列化需要進行額外工作(實現Serializable)/** * Created by luffy on 9/21/15. * 方法一實現單例模式:使用靜態常量來作為唯一的例項,保證該類只有一個例項 */ public class Elvis01 { public static final Elvis01 ELVIS_01 = new Elvis01(); private Elvis01(){ } public void leaveTheBuilding(){ System.out.println("Elvis01 leaveTheBuilding"); } }
2.餓漢變種(提供靜態方法獲取例項)
特點:執行緒安全,不能防止反射攻擊,序列化需要進行額外工作(實現Serializable)/** * Created by luffy on 9/21/15. * 方法二實現單例模式:通過提供靜態方法獲取該類的例項 */ public class Elvis02 implements Serializable{ private static final Elvis02 elvis = new Elvis02(); private Elvis02(){ } public void leaveTheBuilding(){ System.out.println("Elvis02 leaveTheBuilding"); } public static Elvis02 getInstance(){ return elvis; } }
3.懶漢式
特點:懶漢式,執行緒不安全,序列化需要進行額外工作(實現Serializable),延時載入/** * Created by luffy on 9/21/15. * 方法三實現單例模式:懶漢式 */ public class Elvis04 implements Serializable{ private Elvis04 instance; private Elvis04(){ } public Elvis04 getInstance(){ if(instance == null){ instance = new Elvis04(); } return instance; } }
4.列舉型別的單例模式
/**
* Created by luffy on 9/21/15.
* 方法四實現單例模式:使用列舉型別,保證執行緒安全
*/
public enum Elvis03 implements Serializable{
INSTANCE;
public void leaveTheBuilding(){
System.out.println("Elvis03 leaveTheBuilding");
}
}
特點:絕對防止多次例項化,即使是面對複雜的序列化活著反射攻擊的時候。雖然這種方法還沒有被廣泛採用,但是單元素的列舉型別已經成為實現Singleton的最佳方法。5.靜態內部類
/**
* Created by luffy on 9/21/15.
* 方法五實現單例模式:靜態內部類
*/
public class Elvis05 implements Serializable{
private Elvis05(){
}
public Elvis05 getInstance(){
return SignletonHolder.instance;
}
private static class SignletonHolder{
private static Elvis05 instance;
}
public void leaveTheBuilding(){
System.out.println("Elvis03 leaveTheBuilding");
}
}
特點:懶載入,執行緒安全