Effective Java 學習筆記(3)

在實現singleton模式時,我們有以下幾種方法。

1. public static final 字段加上private 的構造函數。

public class Singleton{
            public static final Singleton INSTANCE = new Singleton();
            private Singleton() { ... }
}

這種方法簡單,其中的字段讓人一目瞭然就知道這個類是Singleton模式,用final關鍵字確保這個變量在初始化後就不會再被更改,但要注意的是小心防止少數別有用心的程序使用AccessibleObject.setAccessible來訪問私有構造函數,這時可以在私有構造函數中判斷當創建第二個實例的時候拋出一個異常。

2. private static final 字段加上private 的構造函數再加上public 靜態工廠函數

public class Singleton{
            private static final Singleton INSTANCE = new Singleton();
            private Singleton() { ... }
            public static Singleton getInstance{}{return INSTANCE;}

}

這種方式不用擔心性能問題,因爲現在的JVM會把絕大多數的靜態工廠函數改爲內聯。此外,這種方法還可以在不改變API的情況下對返回值進行改變,即在以後根據需要是否返回第二個實例,或是每個線程一個實例。

對於以上兩種方法在串行化的時候要注意,不能僅僅只加上implements Serializable接口,這樣會導致每次反序列化的時候創建一個新對象,這樣就不是真正的singleton了,解決這個問題的方法是在聲明的時候對每一個final字段加上transient關鍵字,然後再實現一個readResolve方法。

private Object readResolve() {
           return INSTANCE;
}

對於java 1.5後的版本,實現singleton模式最好的方法是用枚舉

public enum Singleton {
              INSTANCE;

}

這種方法沒有上面說的缺點,是最優的方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章