4

まず、シングルトン クラスのサブクラスを作成しようとはしていません。(少なくとも私はそうしようとしていないと確信しています)。

ClassA私は抽象的なクラスを持っています。

私は 2 つのクラスを持ってClassA1ClassA2ますClassA

シングルトンクラスClassA1になりたいです。ClassA2そのためには、それぞれにコードを書くこともできますが、一度コードを書いて、ClassAそれをすべてのサブクラスで再利用することをお勧めします。これを行う方法はありますか?

4

3 に答える 3

6

おそらくそうではありません-シングルトンパターンには静的メソッド/フィールドが必要です。これはClassA、1 か所で定義されている場合、およびそのすべてのサブクラスによって共有されます。

于 2012-05-14T16:59:56.440 に答える
1

と A2のプライベート コンストラクターとClassA1、オブジェクト作成用の静的メソッドを用意することをお勧めします。このようにして、オブジェクトの作成を完全に制御できます。『EffectiveJava』という本には、このアプローチの利点が詳しく説明されています。

于 2012-05-14T17:00:43.323 に答える
1

これが行われる唯一の場所は、Enum を拡張する enum クラスです。言語のひねりなどを使用しますclass ClassA<T extends ClassA>。次のいずれかを行います。

public class ClassA {

    private static final Map<Class<? extends ClassA>, ClassA> singletons = new HashMap<>();

    public static <T extends ClassA> T get(Class<T> klazz) {
        T singleton = klazz.cast(singletons.get(klazz));
        if (singleton == null) {
            try {
                singleton = klazz.getConstructor().newInstance();
            } catch (InstantiationException | IllegalAccessException
                    | IllegalArgumentException | InvocationTargetException
                    | NoSuchMethodException | SecurityException e) {
                throw new IllegalArgumentException(e);
            }
            singletons.put(klazz, singleton);
        }
        return singleton;
    }
    protected ClassA() { }
}

または、複数のシングルトンの必要性を再考し、一般的なコンテナー ルックアップ (おそらく宣言型 XML または注釈を使用) または Bean コンテナーを実行します。EJB 3.1 は非常に素晴らしくシンプルです。

于 2012-05-14T17:45:39.210 に答える