Java 使用 Enum 實現單例模式


這篇文章中介紹了單例模式有五種寫法:懶漢、餓漢、雙重檢驗鎖、靜態內部類、枚舉。如果涉及到反序列化創建對象時推薦使用枚舉的方式來實現單例,因為Enum能防止反序列化時重新創建新的對象。本文介紹 Enum 的使用方式。

public enum SingletonEnum{
    INSTANCE;
}

通過SingletonEnum.INSTANCE來訪問實例,使用方式很簡單. 然而就這么簡單的話也沒有更多意義,具體的使用方式如下[1]:

public enum SingletonEnum {
    INSTANCE;
    int value;
    // 這里我們可以自定義構造函數.
    private SingletonEnum() {
        value = 1;
        System.out.println("INSTANCE now created!");
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
}

調用:

System.out.println("start get instance!");
SingletonEnum singleton = SingletonEnum.INSTANCE;
System.out.println(singleton.getValue());
singleton.setValue(2);
System.out.println(singleton.getValue());

輸入結果為:

start get instance!
INSTANCE now created!
1
2

上面的SingletonEnum的定義利用的enum是一種特殊的class.代碼中的第一行INSTANCE會被編譯器編譯為SingletonEnum本身的一個對象.當第一次訪問SingletonEnum.INSTANCE時會創建該對象,並且enum變量的創建是線程安全的.[2]


  1. https://dzone.com/articles/java-singletons-using-enum ↩︎

  2. https://stackoverflow.com/questions/26285520/implementing-singleton-with-an-enum-in-java ↩︎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM