[英]How the object for singleton class is initialized?
我正在審查以下代碼,我對FlowSpaceImpl類的空白構造函數感到困惑。 由於構造函數是私有的,並且FlowSpaceImpl實例被設置為靜態和私有,因此其顯而易見的開發人員只需要此類的一個實例。 但是當調用新的FlowSpaceImpl()時,如何在第一個位置初始化FlowSpaceImpl類的對象。 對於代碼審查,您可以查看FlowSpaceImpl實現
public class FlowSpaceImpl implements FlowSpace {
private static FlowSpaceImpl instance = null;
private FlowSpaceImpl() {}
private static FlowSpaceImpl getInstance() {
if (instance == null)
instance = new FlowSpaceImpl();
return instance;
}
}
您的實例變量是static
,實例構造函數沒有用。 這是初始化變量的代碼
private static FlowSpaceImpl getInstance() {
if (instance == null) {
instance = new FlowSpaceImpl();
}
return instance;
}
因此,當調用getInstance
時,如果它為null
,則在返回之前初始化它。
請注意,此代碼不是線程安全的 ,因此非常非常糟糕。
編寫線程安全單例的普遍接受的方法是:
public class FlowSpaceImpl implements FlowSpace {
public static FlowSpaceImpl getInstance() {
return InstanceHolder.INSTANCE;
}
private static class InstanceHolder {
private static final FlowSpaceImpl INSTANCE = new FlowSpaceImpl();
}
private FlowSpaceImpl() {
}
}
此代碼利用Java語言規范中的原子性保證來確保線程安全。 更多信息在這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.