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

问题在于,在 Java 中(与 .NET 不同),无论您提供多少不同类型的参数,您都只有一个静态变量 - 所以MySingleton<Foo>._instance等于MySingleton<Bar>._instance.

我怀疑你想要一个Map<Class<? extends AUsefulClass>, MySingleton>,抑制有关原始类型的警告。然后你会让你的instance方法也接受一个Class<T>参数,所以它会知道要查找什么。

当然,这是假设您想要不同类型参数的单独状态。如果您不需要不同的状态,MySingleton<Foo>并且MySingleton<Bar>您可以真正拥有一个实例,并在抑制未经检查的转换警告的同时进行转换。

于 2011-02-22T17:55:58.473 回答
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;
    }
}

如果您计划重新分配myUsefulRegistry,您显然必须省略final修饰符并根据type参数实现状态(通过将其存储以再次使用)。

编辑:如果用户将不同的类型传递给原始类型,则会出现问题。您可能希望在任何情况下都存储该类型,以便您可以检查任何正在进行的调用getInstance(Class<T>)是否有效。

于 2011-02-22T19:43:49.180 回答
0

在这种情况下,我宁愿看看我的设计。另外,如果你想创建一个不同的单例应有的情况。一开始您可能会使用工厂来实例化单例。

我不确定单例模式是否是一种好方法,它通过对象引入全局状态,这正是您可能不想要的。

于 2011-02-22T20:04:29.773 回答