java - 为泛型类的每个类型参数创建单独的单例的最佳习惯用法?

标签 java generics static singleton idioms

(也许是 "How to create a generic singleton class in java?" 的补充问题:)

class MyClass<T> {
    private static Map<Class<MyClass<?>>, MyClass<?>> s_instances =
        new HashMap<Class<MyClass<?>>, MyClass<?>>();

    public static MyClass<?> blah(Class<MyClass<?>> clz)
            throws InstantiationException, IllegalAccessException {
        if (s_instances.get(clz) != null)
            return s_instances.get(clz);
        MyClass<?> instance = clz.newInstance();
        s_instances.put(clz, instance);
        return instance;
    }
}

是否有更好的习惯用法可以让每个类型参数值具有一个单例?

编辑:请不要仅仅回答指出缺乏线程安全性。点已采取。我在问是否可以做一些比这张 map 更优雅的事情。

最佳答案

请不要这样做。
答:你的单例不是线程安全的。
B. 注意 double check pattern issues at Java
C. 在每个类中都有静态初始化器并具有:

真的那么难吗?
static {
   instance = new MySingleton();
}

然后

public static MySingleton getInstance() {
return instance
}

如果你真的坚持 -
1.您可以定义一个单例来管理实例映射中的类型(键是类或完整类名,值是对象)
2. 您可以在那里添加注册您想要的类型(我建议他们有私有(private) CTOR)。
3.使用this回答以便调用私有(private) CTOR ,并创建一个要放置在映射条目的值中的实例。
4. 向 1 中提到的存储库提供 getInstance 方法,其签名为:

public Object getInstanceByType(Class<?> clazz)

该方法将从内部映射中获取实例。

关于java - 为泛型类的每个类型参数创建单独的单例的最佳习惯用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13451217/

相关文章:

java - 如何在eclipse中永久设置javac的语言为英文

java - 无法使用 POST 请求和 Jackson 发送 JSON

c# - 如何设置泛型类的基类属性

c# - 具有接口(interface)和通用模​​型的 WCF

swift - 协议(protocol)不符合自身?

c# - 在静态方法中管理一次性对象

java - 没有合适的排序错误方法

java - Android:UIL 我希望能够多次加载同一张图像

android - 检查 RadioGroup 是否选中并获取静态 int 值

java - Java 中静态变量的延迟初始化 - 执行?