第3條:用私有構造器或者列舉型別強化Singleton屬性
阿新 • • 發佈:2019-02-14
Singleton指僅僅被例項化一次的類。
例如:檔案系統,資料庫連線,視窗管理器等
在Java 1.5之前,實現Singleton有兩種方法,這兩種方法都要把構造器保持為私有的,下面直接貼例項程式碼,應該都能看懂:
第一種:
需要獲取的公有靜態成員(需要實現Singleton的物件)是個final域
public class DataBaseSource{
public static final DataBaseSource INSTANCE = New DataBaseSource();
private DataBaseSource(){...}
//省略其餘程式碼
}
第二種:
需要獲取的公有的成員(需要實現Singleton的物件)是個靜態工廠方法
public class UtillA{
public static final DataBaseSource INSTANCE = New DataBaseSource();
private DataBaseSource(){...}
public static DataBaseSource getInstance(){return INSTANCE;}
//省略其餘程式碼
}
從Java 1.5發行版本開始。採用單元素的列舉型別已經成為實現Singleton的最佳方法
為什麼?
因為這樣的寫法更加簡潔,無償提供了序列化機制,絕對防止多次例項化,即使在面對複雜的序列化或者反射攻擊的時候也可以。
只需要編寫一個包含單個元素的列舉型別:
public enum DataBaseSource{
INSTANCE;
private DataBaseSource(){...}
public void method1(){
//省略方法實現
}
public void method2(){
//省略方法實現
}
}
//如何呼叫?
public class Test {
public static void main(String[] args) {
DataBaseSource.INSTANCE.method1();
DataBaseSource.INSTANCE.method2();
}
}