2

このシングルトンデザインパターンは正しいですか?つまり、オブジェクトが静的でメソッドが同期されているときに、オブジェクトがnullであるかどうかをチェックする必要があるということです。

public class MySingleton {

    int val = 10;
    private static final MySingleton singleton = new MySingleton();

    private MySingleton() { }

    public static synchronized MySingleton getSingleton() {
        return singleton;
    }
}
4

3 に答える 3

8

メソッドを同期する必要はありません。変数が静的初期化子で初期化されるという事実で十分です。また、val変数はほぼ確実にプライベートにする必要があります...

ダブルチェック ロック パターン (nullity チェック付き) は通常、同期メソッドが必要なく、静的初期化子も必要ない場合に使用されます。(私の考えでは、ほとんどの場合、不必要に複雑で脆いものです。)

別のオプションは、列挙型を使用することです。

public enum MySingleton {
    INSTANCE;

    private int val = 10;

    // Presumably something to use val
}

列挙型を使用すると、シングルトン性が強制され、シリアル化に直面してもそれが正しくなります。それはまた、実際のコードなしでそれを行う非常に簡単な方法です:)一方、それは私にとって完全に正しいとは決して感じませんでした...

于 2013-02-15T08:32:27.530 に答える
2

最適なパターンは、Joshua Bloch が著書『Effective Java, using an Enum』で示したものです。

public enum MySingleton {
    INSTANCE;

    public void doSomething() {

    }
}

本の引用:

「このアプローチは、パブリック フィールド アプローチと機能的に同等ですが、より簡潔であり、シリアライゼーション メカニズムを無料で提供し、複雑なシリアライゼーションまたはリフレクション アタックに直面した場合でも、複数のインスタンス化に対する鉄壁の保証を提供します。このアプローチは、まだ広く採用されていないため、単一要素の列挙型がシングルトンを実装する最良の方法です。」

于 2013-02-15T08:34:29.933 に答える
2

そのようにすることもできますが、多くの場合、「遅延評価」を使用できます。最初にリクエストされたときにインスタンスを作成します。

public class MySingleton {

    private static MySingleton singleton = null

    private MySingleton() { }

    public static synchronized MySingleton getSingleton() {
        if (singleton == null) {
            singleton = new MySingleton();
        }
        return singleton;
    }
}
于 2013-02-15T08:34:39.380 に答える