效益

2014-12-07 79 views
0

我已經看到了這個代碼,有兩種不同的方式書面效益

public static void main(String[] args) { 
    Tester.boot(); 
    new tester(); 

Tester類:

public static tester instance; 

public static void boot() { 

    if (instance == null) 
     instance = new tester(); 
} 

public Tester() { 
    System.out.println("test made"); 
} 

是什麼beetween tester.boot();new tester();

的區別

兩者都有好處嗎?

+0

僅用於創建對象實例的方法(除構造函數外)或對象稱爲*工廠*。 – Raedwald 2014-12-07 08:38:46

+0

您應該發佈編譯成功的簡短代碼示例。 – PeterMmm 2014-12-07 08:41:31

回答

2

這裏有正在顯示三個概念:

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是從來沒有設置回nullboot()將構造一個Tester只有一次,不管它是如何調用的次數。由於instancepublic它可以隨時通過知道Tester的任何事情設置爲null。這樣做會允許boot()再次構建,舊的Tester對象將被遺忘(垃圾收集)。

由於Tester小號構造尚未取得private沒有說Tester永遠不會被比boot()其他東西構成擔保。這意味着仍可能有許多Tester對象在運行。但他們都有一個instance在他們可能會或可能不是他們自己。

一個典型的單例會有延遲初始化,是自引用的,並且被封裝在最多隻有一個Tester對象永遠存在的地方。然而,這裏沒有什麼證明這本來就是一個單身人士。這可能是一個建設優化失去了可怕的錯誤。

0

boot沒用,你沒有顯示如何使用Instance。但我認爲它的實現是singleton,這意味着確保只創建一個類的實例。我不認爲這是一個很好的實現,因爲Instance可以被錯誤地使用而不被初始化。

當您編寫new tester()時,則會創建一個新的實例tester對象。

請按照Java Naming Convention並相應地重命名您的變量。

1

這是用Java實現的一種SINGLETON模式。 看這裏瞭解這種模式click here.

不久,你想用這個模式背後的概念,如果你想擁有類實例槽的所有應用程序的生命週期中的一個實例。

要理解它,在你的代碼的關鍵是在部分「如果(例如== NULL)」{實例應該與下級密鑰寫的,因爲它應該是一個類變量}。

如果你只是簡單地使用「new ...」,可以創建這個變量的任何實例的nuber。 如果您使用引導方法,您確定該實例始終相同。

無論如何,在執行過程中你已經寫了一些東西丟失。

您應該參考此link,其中還有一個Java編程語言的完整實現。

0

具體說明 - 如果使用tester.boot(),它會正確設置「實例」,如果直接調用構造函數,則不會。

這是一個真正的單例模式的破碎版本,要正確地做到這一點,構造函數應該是私有的,這使得新的Tester()不可能。

此外,引導方法應該看起來有點更像:

public synchronized static Tester boot() 
{ 
    if(instance == null) { 
     instance=new Tester(); 
    } 
    return instance; 
} 

甚至認爲可能是前途未卜。

0

閱讀this評論以瞭解什麼時候有實例,何時沒有實際意義。