枚舉單例模式

單例模式作為最常見的設(shè)計模式之一,一直是面試中的熱點問題,常用的餓漢式懶漢式等單例寫法總會有各種各樣的不足,特別涉及到反射與序列化問題時,這些常用的單例寫法都得做特殊處理才能保證對象實例唯一性,具體原因請自行百度。

每個介紹單例寫法的文章總會提到枚舉單例模式,但由于枚舉引入較晚,熟悉的人不多,總會讓人感覺無法理解其好處與優(yōu)勢,其實枚舉單例乃是最完美的單例模式寫法,沒有之一,所有上面所提到的其它寫法的不足之處在枚舉單例寫法中都被完美解決,下面介紹幾種枚舉單例寫法并介紹其原理。

接口實現(xiàn)形式

對于一個標準的enum單例模式,最優(yōu)秀的寫法還是實現(xiàn)接口的形式:

// 定義單例模式中需要完成的代碼邏輯
public interface MySingleton {
    void doSomething();
}

public enum Singleton implements MySingleton {
    INSTANCE {
        @Override
        public void doSomething() {
            System.out.println("complete singleton");
        }
    };

    public static MySingleton getInstance() {
        return Singleton.INSTANCE;
    }
}

內(nèi)部枚舉類形式

1.構(gòu)造方法中實例化對象
public class EnumSingleton {
    private EnumSingleton(){}
    public static EnumSingleton getInstance(){
        return Singleton.INSTANCE.getInstance();
    }

    private enum Singleton{
        INSTANCE;
        private EnumSingleton singleton;
        //JVM會保證此方法絕對只調(diào)用一次
        Singleton(){
            singleton = new EnumSingleton();
        }
        public EnumSingleton getInstance(){
            return singleton;
        }
    }
}
2.枚舉常量的值即為對象實例
public class EnumSingleton {
    private EnumSingleton(){}
    public static EnumSingleton getInstance(){
        return Singleton.INSTANCE.getInstance();
    }

    private enum Singleton{
        INSTANCE(new EnumSingleton());
        private EnumSingleton singleton;
        //JVM會保證此方法絕對只調(diào)用一次
        Singleton(EnumSingleton singleton){
            this.singleton = singleton;
        }
        public EnumSingleton getInstance(){
            return singleton;
        }
    }
}

總結(jié),JVM會保證枚舉類構(gòu)造方法絕對只調(diào)用一次,所以保證了對象實例的唯一性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • statement:本篇內(nèi)容只是建立在我目前經(jīng)驗的基礎(chǔ)之上,必然有不完善甚至是不正確的地方,請謹慎閱讀,如果能指出...
    睦月MTK閱讀 278評論 0 2
  • 需要單例的對象: public class User { /** * 名字 */ private String...
    五毛_0b89閱讀 85評論 0 0
  • 枚舉單例模式簡單實踐,用枚舉構(gòu)建一個百度API的client唯一實例。 測試類 結(jié)果為 在程序運行過程中獲取的是唯...
    寫代碼的杰西閱讀 353評論 0 2
  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,623評論 1 8
  • 單例模式(SingletonPattern)一般被認為是最簡單、最易理解的設(shè)計模式,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,530評論 4 34

友情鏈接更多精彩內(nèi)容