2013-03-18 68 views
3

有沒有人知道這兩種方法的區別?最終靜態與非最終靜態變量?

public class SingleTone { 

    private static final instance = new SingleTone(); 

    private SingleTone() { 
    } 
    public [static] SingleTone getinstance() { 
     return instance; 
    } 
} 

public class SingleTone { 

    private static instance = new SingleTone(); 

    private SingleTone() { 
    } 
    public [static] SingleTone getinstance() { 
     return instance; 
    } 
} 

我知道最後的靜態變量是線程安全的,但是我無法找到與非最後一個任何問題。 (注:我正在尋求最終靜態變量與非最終靜態變量的差異,所以請不要建議如何實現Singleton設計模式。我知道有一個Enum方法。)

編輯:我錯過了方法現在固定的靜態關鍵字!

+2

與問題不相關,但更多的僅供參考:模式實際上稱爲「單身」。 – 2013-03-18 19:33:19

+0

我本意是命名類SingleTone我知道模式名稱是Singleton,你可以看到我在我的問題的底部使用單例 – 2013-03-18 19:50:48

回答

2

除了可能的編譯器優化之外,沒有太大差別。在任何一種情況下,因爲它是私人的,沒有設置者,所以沒有什麼可以修改的,所以它不是特別重要,如果它不是final。但是,在這兩種情況下,您的getInstance()方法需要聲明爲static

+1

類中的其他東西可能會改變它,這意味着它的任何發佈的實例將有一個陳舊的參考。如果你不使用IoC容器並且管理你的單身人士,我總是會推薦使用final。 – James 2013-03-18 19:35:02

+0

同意 - 最好的做法是將其聲明爲最終的,但如果您控制類並且不定義任何修改屬性的代碼,那麼它就是*有效*最終。 – Adrian 2013-03-18 19:36:47

+0

沒錯,單身人士還有其他許多問題,例如,你永遠無法創建一個,因爲'getinstance()不是靜態的,而且它有一個私有構造函數。 :) – James 2013-03-18 19:38:39

1

final修飾符表示沒有別的東西會被分配給該字段。那就是你不能對它使用equals(=)運算符。雖然static修飾符意味着變量是類的一部分,而不是實例的一部分,所以無論您擁有多少個實例,只會有一個。

第一種方法然後使參考線程安全,因爲我們知道該值在初始化後不會改變。但是,如果我們有最終結構,我們需要確保內容同步。有關更多信息,請參見this question

0

最終將不會給你任何特殊的性能改善。

我們使用最終的清晰設計方法。根據喬希布洛赫的「繼承或禁止設計」的經驗法則,應該可能更常使用最終的類,而不僅僅是這種情況。