2016-03-07 57 views
1

我努力的練習代碼分析和已經注意到,有一個在下面的代碼snippet.What沒有參數(這是私人)構造函數是這個整體的代碼背後的目的是什麼?什麼是不帶參數的私人constuctor的目的是什麼?

public class Wit { 

    public static Wit instance = null; 
    private Wit() { 
    } 


    public static Wit getInstance() { 
     if (instance ==null){ 
      instance = new Wit(); 
     } 
     return instance; 
    } 
} 
+2

這是Singleton模式的一個例子:https://en.wikipedia.org/wiki/Singleton_pattern – kirbyquerby

+1

令人吃驚的是你怎麼樣只是能夠通過看它認識到這種模式!認真。謝謝。 – user37398

回答

2

這也是繼singleton pattern,這可以確保一個類可以通過使其默認構造函數的私人和內部處理實例只有一個實例。

在你的榜樣,但是,單保證被暴露非最終instance變量打破。任何人都可以一起去,並設定參考爲空,導致要到getInstance()下一調用創建另一個實例。

1

這是你關注在一開始構造一個好事。

讓我們快速通過幾個點進行瀏覽。

1.需要構造函數來創建一個類的對象/實例。

2.如果您自己定義了任何構造函數,則會自動創建一個默認的no-arg public構造函數。

3.如果您確實定義了構造函數,則不會創建任何默認構造函數。

4.在你的榜樣,類威特有私人construtor,其中有2個含義:

A.沒有默認構造函數將被創建(這意味着私人威特()是唯一construtor類Wit有)

B.由於只有你的類的構造函數是一個私有構造函數,私有成員只能由類內的代碼調用,所以類的對象只能在類Wit內創建。在你的情況下,這是通過調用getInstance方法完成的。因爲Wit的instance和getInstance()成員是靜態的,並且在getInstance()中,所以只有在實例爲空(即不指向任何對象)的情況下,纔會在代碼中放入代碼以創建新實例,因此,你的班級實施了單身模式。

編輯: =====

有某些情況下,當對象被創建繞過構造函數調用。有幾個例子是克隆和反序列化。但深入研究這些問題超出了這個問題的範圍。

+0

我不同意沒有1.有某些情況下,構造函數沒有被調用,但對象被創建。例如克隆() – Enzokie

+0

事實上,即使在反序列化過程中,構造函數也沒有被調用。更新我的答案以包含這一事實。 – theLearner

0

來添加現有的答案,我特地爲私有的構造

  • 您可以控制實例特定類創建的數量多少好處。 (ref:Effective Java)。使用私有構造函數,沒有人可以創建類的實例,並且實例是從工廠方法分發的。這使我們可以保持共享實例的數量或分發類的現有實例。我們可以控制實例創建。

  • 私人構造函數對實現不變性很有用。當有人繼承該類時,默認調用父項的默認構造函數,即​​。 。現在假設有人試圖擴展你的類,這是不可能的,因爲你的默認構造函數是私有的。這會導致編譯時本身失敗。

  • 當我們需要編寫像java.lang.Math這樣的工具類,它只包含實用程序的靜態方法時,我們也使構造函數爲私有。目的是傳遞清晰的信息,將其用作實用程序。