實例化我有一個學校的任務,我必須在某個給定的項目中發現模式。一切都很好(相對而言),但似乎我發現的大多數模式都是某種變化。我必須找到的單身人士也不例外。單身人士用這個
代碼如下。關於這個奇怪的是,這個類似乎並沒有與下面的構造函數來實例化,正如人們所預料:
public Singleton() {
if (singleton == null) {
singleton = new Singleton();
}
}
但是,instatiated與this
(你可以在下面的原代碼中看到)?根據我的理解,這會創建某種靜態單例?我調試,看到確實第一次構造函數被稱爲
Singleton x = new Singleton();
x.Print();
,它確實爲空。而this
是一個Singleton實例。但是,不應該存在
private static Singleton singleton = new Singleton();
而不是singelton = this;
?
public class Singleton {
private static Singleton singleton;
public static Singleton getDefault() {
return singleton;
}
/**
* The constructor.
*/
public Singleton() {
if (singleton == null) {
singleton = this;
}
}
public void Print()
{
System.out.println("I'm a singleton!");
}
}
我敢肯定,這確實是一個單身,這只是我從來沒有見過的類型,我不明白背後的原因,那就是我basicly問。
重點不在於修改代碼;關鍵是要報告爲什麼這是一個單身人士。這顯然是一個單身人士,但我很困惑這是如何用''this'實現的。 –
您在調用構造函數的那一刻創建了實例,因此'this'指向您的實例(通常會使用例如'this.name = name'將成員變量的值賦給它們)。由於單身人士尚未初始化,它將是'空',你可以分配你的實例。之後,進一步的初始化當然有'singleton!= null',所以不會有新的賦值。 然而,這種方式並不真正乾淨,因爲調用Singleton.getDefault()。Print();'會導致nullPointerException。 –
它根本不是單身人士,因爲任何人都可以調用構造函數並獲得新實例。這是糟糕的代碼,沒有別的。當然不是設計模式。沒有任何意義。我真的希望老師的意圖是讓你發現這個代碼的蹩腳性,而不是讓你相信它實際上是一個單身人士。 –