簡體   English   中英

如何初始化單例類的對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM