這裏有正在顯示三個概念:
Tester類:
if (instance == null)
instance = new tester();
當您希望控制對象的構造時使用。變量instance
控制是否new Tester()
將由boot()
調用。
這可以用來實現Lazy Initialization。這是延遲對象構造直到需要時的做法。它通常用於建築既昂貴又不總是需要的情況。這裏被推遲到boot()
被調用。延遲初始化不僅用於單身人士。 Some認爲在Java中使用Lazy Initialization創建singleton
實際上是錯誤的,因爲類加載器的工作方式。他們聲稱這是一個從C++移植過來的習慣。作爲一種模式,單身人士已經有足夠的爭議,some call it an anti pattern。
Tester類:
public static tester instance;
boot()
,構建了一個Tester
對象,設置instance
到該對象(注:tester
應該是大寫)。 instance
,其類型爲Tester, resides in the
測試儀class means that
測試儀is [**self referential**][7], like the nodes in a linked list. But, unlike nodes, because
實例is
靜態, all
測試儀objects have the same copy of
實例`。
因爲開機從不把它構建了任何地方,但在instance
,只有一個boot()
構建Tester
對象曾經存在於任何時候,只要instance
是從來沒有在任何地方複製。很容易,因爲它是public
。
只要instance
是從來沒有設置回null
boot()
將構造一個Tester
只有一次,不管它是如何調用的次數。由於instance
是public
它可以隨時通過知道Tester
的任何事情設置爲null
。這樣做會允許boot()
再次構建,舊的Tester
對象將被遺忘(垃圾收集)。
由於Tester
小號構造尚未取得private
沒有說Tester
永遠不會被比boot()
其他東西構成擔保。這意味着仍可能有許多Tester
對象在運行。但他們都有一個instance
在他們可能會或可能不是他們自己。
一個典型的單例會有延遲初始化,是自引用的,並且被封裝在最多隻有一個Tester
對象永遠存在的地方。然而,這裏沒有什麼證明這本來就是一個單身人士。這可能是一個建設優化失去了可怕的錯誤。
僅用於創建對象實例的方法(除構造函數外)或對象稱爲*工廠*。 – Raedwald 2014-12-07 08:38:46
您應該發佈編譯成功的簡短代碼示例。 – PeterMmm 2014-12-07 08:41:31