2013-02-15 134 views
2

這個單身設計模式是否正確?我的意思是,當它是靜態的並且方法被同步時,檢查對象的需求是否爲null。這個單身設計模式是否正確?

public class MySingleton { 

    int val = 10; 
    private static final MySingleton singleton = new MySingleton(); 

    private MySingleton() { } 

    public static synchronized MySingleton getSingleton() { 
     return singleton; 
    } 
} 

回答

8

您不需要使您的方法同步。變量在靜態初始化器中被初始化的事實就足夠了。此外,您val變量應該幾乎可以肯定是私有的......

雙重檢查鎖定模式(與無效檢查)通常被用來當你要同步的方法,你想要一個靜態初始化器。 (在我看來,它在幾乎所有情況下不必要的複雜和脆弱。)

另一種選擇是使用一個枚舉:

public enum MySingleton { 
    INSTANCE; 

    private int val = 10; 

    // Presumably something to use val 
} 

使用枚舉強制執行單的煩躁,甚至在得到它的權利序列化的臉。它也沒有實際的代碼做的一個非常簡單的方法:)。另一方面,它從來沒有感覺到完全我的權利......

+0

關於synchronized關鍵字,我還有一個疑問,是靜態的變量或方法的線程安全的我用Google搜索了一下,我的第一印象,他們都沒有,大公的 – 2013-02-15 09:02:30

+2

@Praveen Kumar,通過調用方法getSingleton(),創建單例對象。由於它已經創建,所以不需要同步。 – Jagannath 2013-02-15 09:18:18

2

最好的模式是一個在他的著作有效約書亞布洛赫給出Java中使用枚舉:

public enum MySingleton { 
    INSTANCE; 

    public void doSomething() { 

    } 
} 

競標書:

「這種方法在功能上等同於公共領域的做法,但它更簡潔,免費提供系列化機械,其提供的對於多重實例化,即使面對複雜的情況,鐵證保證完美的序列化或反射攻擊。雖然這種方法尚未被廣泛採用,但單元枚舉類型是實現單例的最佳方式。「

+0

你好,我的答案不提供。 bute much,因爲你不說*爲什麼*這種模式是「最好的」。爲了改善你的答案,你可以寫一些關於它的優點和缺點,以及爲什麼優於OPs方法。 – Philipp 2013-02-15 08:37:07

+0

我編輯了我的答案 – overmeulen 2013-02-15 08:43:40

2

你可以這樣做,但在很多情況下,你可以使用」懶惰評估「 - 你創建實例是要求在第一時間:

public class MySingleton { 

    private static MySingleton singleton = null 

    private MySingleton() { } 

    public static synchronized MySingleton getSingleton() { 
     if (singleton == null) { 
      singleton = new MySingleton(); 
     } 
     return singleton; 
    } 
} 
+2

值得注意的是,除非您有其他靜態方法,您希望能夠在不創建實例的情況下運行,否則只需使用靜態初始化程序就可以了 - 在第一次使用該類之前,它仍然很懶。 – 2013-02-15 08:35:28