使用靜態初始化實現線程安全單例時,還是實例的簡單靜態聲明就足夠了,是否需要Initialize-On-Demand成語?Initialize-On-Demand idiom vs Simpleton實現中的簡單靜態初始化程序
實例作爲靜態字段的簡單聲明:
class Singleton
{
private static Singleton instance=new Singleton();
private Singleton() {..}
public static Singleton getInstance()
{
return instance;
}
}
VS
class Singleton {
static class SingletonHolder {
static final Singleton INSTANCE = new Singleton();
}
private Singleton() {..}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
我問這個是因爲布賴恩戈茨建議本文中的第一個辦法:
http://www.ibm.com/developerworks/java/library/j-dcl/index.html
而他在這篇文章中建議後者
http://www.ibm.com/developerworks/library/j-jtp03304/
是否後者的做法規定,前者沒有任何好處?
我不確定是否需要讓班級最終決定。擁有私人構造函數還不夠嗎? 另外,請注意,如果單例需要從類繼承,則枚舉不是一個選項。 – simpatico