【发布时间】:2019-01-04 02:06:20
【问题描述】:
我想实现一个通用的单例工厂模式,其中我将所需对象的类作为参数传递,工厂类应该检查映射是否已经为它创建了一个对象,如果是,则从映射返回对象.如果没有,则创建一个新实例,将其放入地图并返回该实例。
我可以将通用返回类型作为 Object,但我不想在调用 get 实例方法的每个地方都强制转换返回的对象。
以下是代码:我在c.cast(instance); 行收到编译错误
我们不使用弹簧/依赖注入,而是尝试实现公共类来处理创建所有单例对象。
public class SingletonFactory {
public static Map<String,Object> objectFactory = new HashMap<String, Object>();
public static <T extends Object> T getInstance(Class<?> c){
String key = c.toString();
Object instance= objectFactory.get(key);
if (instance == null) {
synchronized (c) {
try {
instance = c.newInstance();
objectFactory.put(key, instance);
} catch(IllegalAccessException | InstantiationException e) {
throw new RuntimeException("Exception while creating singleton instance for class : "+key+" - Exception Message : "+e);
}
}
}
return c.cast(instance);
}
}
【问题讨论】:
-
你希望从函数中返回泛型,但实例是一个非泛型的对象
-
是的,所以只是想弄清楚如何将我的地图声明为具有泛型类型。是否至少可以实现这样的工厂。我想我很接近,但不知道如何编写该代码。
-
你应该把
Class<?>改成Class extends T> 所以当你进行强制转换时,它会将实例强制转换为 T
标签: java singleton generic-programming