2

私はこれを解きほぐすことはできません。

public class MySingleton<T extends AUsefulClass>{
    Map<String, T> myUsefulRegistry;
    private static MySingleton<T> _instance = null;

    public static instance(){
        if(instance == null)
            _instance = new MySingleton<T>();

        return _instance;
    }
}

public class Test{
    @Test
    public void testThis(){
        MySingleton<SomeClass> mySingleton = MySingleton<SomeClass>().instance();
    }
}

非静的Tへの静的参照を作成できないため、このパラメーター化には誤りがあります。それでも、パラメーター化可能なシングルトンクラスを構築したいと思います。

4

3 に答える 3

4

MySingleton<Foo>._instance問題は、Java では (.NET とは異なり)、提供する異なる型引数の数に関係なく、静的変数が 1 つしかないことですMySingleton<Bar>._instance

Map<Class<? extends AUsefulClass>, MySingleton>生の型に関する警告を抑制するが必要だと思われます。次に、instanceメソッドにもClass<T>パラメーターを使用させて、何を検索するかを認識させます。

もちろん、これは、異なる型引数に対して個別の状態が必要であることを前提としています。別の状態が必要なくMySingleton<Foo>本当にMySingleton<Bar>単一のインスタンスを持つことができ、未チェックの変換警告を抑制しながらキャストすることができる場合。

于 2011-02-22T17:55:58.473 に答える
0

この場合、私のデザインを見てみたいと思います。また、状況により別のシングルトンを作成したい場合。おそらく、最初はファクトリを使用してシングルトンをインスタンス化するでしょう。

シングルトン パターンが良いアプローチであるかどうかはわかりません。オブジェクトを介してグローバルな状態を導入しますが、これはおそらく望んでいないことです。

于 2011-02-22T20:04:29.773 に答える
0

解決策は次のとおりです。

public class MySingleton {
    private static MySingleton instance;

    private final Map<String, ?> myUsefulRegistry;

    private <T> MySingleton(Class<T> type) {
        myUsefulRegistry = new HashMap<String, T>();
    }

    public static <T> MySingleton getInstance(Class<T> type) {
        if (instance == null) {
            instance = new MySingleton(type);
        }
        return instance;
    }
}

の再割り当てを計画している場合は、明らかにfinalmyUsefulRegistry修飾子を省略し、パラメーターに基づいて状態を実装する必要があります (再度使用するために保存することにより)。type

編集: ユーザーが元の型とは異なる型を渡すと問題が発生します。その場合、どのような場合でもタイプを保存したい場合があるため、進行中の呼び出しgetInstance(Class<T>)が有効かどうかを確認できます。

于 2011-02-22T19:43:49.180 に答える