0

FlowSpaceImpl クラスの空のコンストラクターと混同している次のコードを確認しています。コンストラクターはプライベートであり、FlowSpaceImpl インスタンスは static および private に設定されているため、明らかに開発者はこのクラスのインスタンスを 1 つだけ必要とします。ただし、 new 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;
            }



}
4

1 に答える 1

2

インスタンス変数は です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 言語仕様の原子性保証を利用して、スレッドの安全性を確保します。詳細はこちら

于 2013-06-02T14:03:07.497 に答える