整明白枚舉單例模式

今天看到單例模式的各種寫法,其中有個使用枚舉實現單例模式的例子,大概是這樣的:

public enum Singleton {
    Instance;

    public void anyMethod(){}
}

看完就蒙圈了,完全不知道怎麼回事,這就寫完了?怎麼用啊?,然後各種百度,網上的例子基本分爲兩種,第一種就是上面寫的那樣,第二種大概是這樣的:

public enum Singleton {
    Instance;
    private SingletonEntity se;

    public SingletonEntity getInstance() {

        se = new SingletonEntity();
        return se;
    }
}

其中SingletonEntity是需要使用單例的類,然後網上說是這麼使用的:

SingletonEntity se = Singleton.Instance.getInstance();

看完更蒙圈了,既然可以在Singleton中new單例對象,那在別的地方不是也可以嗎?那哪都可以new單例對象,還叫單例對象麼?

蒙圈中突然想到,爲什麼用枚舉的方式來實現單例模式?因爲枚舉的構造方式和單例模式很像(構造方法私有化),而且不用考慮序列化等問題。那麼也就是說枚舉類本身很符合單例模式,也就是說上面代碼中的Singleton纔是我們需要的單例。
簡單寫個例子:

// 單例
public enum BeanContext {

    Instance;
    private BeanContext() {
        System.out.println("init");
    }
    public void print() {

        System.out.println("ffffffffffff");
    }

//測試
public static void main(String[] args) {

        BeanContext b1 = BeanContext.Instance;
        b1.print();
        BeanContext b2 = BeanContext.Instance;
        b2.print();
        BeanContext b3 = BeanContext.Instance;
        b3.print();
        BeanContext b4 = BeanContext.Instance;
        b4.print();
    }

打印結果中顯示只打印了一次 “init”,說明只初始化了一次該對象;

回頭想想,起始第一段代碼已經說明了該枚舉類本身就實現了單例,但是對枚舉使用的比較少,沒想明白是怎麼回事。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章