(也许是 "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/