[英]Singleton vs public static final variable
所以我知道單例模式是這樣實現的:
public class ClassName {
private static ClassName instance;
public static ClassName getInstance() {
if (instance == null) {
instance = new ClassName();
}
return instance;
}
private ClassName() {}
}
我想問的是為什么你不能這樣做:
public class ClassName {
public static final ClassName instance = new ClassName();
private ClassName() {}
}
方式代碼更少,似乎完全相同。 當然,減去延遲初始化,但我不明白為什么懶惰初始化無論如何都會是一個重要的好處。 我不是很有經驗,如果你能用你的知識啟發我,我將不勝感激,謝謝。
初始化單例實例內聯並讓類加載器擔心同步可能不是一種非常常見的做法,但它絕對不是聞所未聞的。
然而,常見的習慣是將實例變量設為私有並通過getter返回它,這樣其他代碼就不會直接依賴它。 這樣,如果將來你決定想要更高級的東西(例如,你提到的延遲初始化),你可以輕松地重構你的代碼而不破壞API:
public class ClassName {
private static final ClassName instance = new ClassName();
public static ClassName getInstance() {
return instance;
}
private ClassName() {}
}
您的第一個代碼使用帶有synchronized
關鍵字的延遲創建。 instance = new ClassName()
這些代碼的問題是instance
var在構造單例之前可能變為非null,並且可以在偽代碼中解釋,JRE用於創建實例:
mem = allocate() ;
instance = mem ;
ctorSingleton(instance)
因此,如果多個線程同時訪問方法getInstance,是否有可能獲得一個新實例,因為在java中你有2條指令和JRE解釋的偽代碼在3中執行。
我認為你的第二個工具是好的,因為你確信它能正常工作,並且線程或同步問題很難解決。
這來自法國文章: http : //christophej.developpez.com/tutoriel/java/singleton/multithread/
這是我一直問單身愛好者的問題,到目前為止,我還沒有聽到一個滿意的答案。 人們說'全局變量是壞的'(我來自C ++世界,所以措辭是C ++特定的,但想法是一樣的)。 當我問他們所愛的辛格爾頓究竟與全球有什么不同時,我聽到的只是悶悶不樂的火腿。 我個人發現Singleton只有一個好處 - 延遲初始化,這使得控制實例化的順序成為可能。 如果不需要,則不需要Singleton。
優勢來自於單例的編寫者可以更新getter(getInstance)以獲得更復雜的規則,而不會導致單例的用戶必須重新編譯他們的代碼。 這就是Mureinik所說的:“那樣,如果將來你決定想要更高級的東西(例如,你提到的延遲初始化),你就可以輕松地重構你的代碼而不會破壞API”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.