gpt4 book ai didi

java - Singleton Factory - 使用 Java 8 实现

转载 作者:行者123 更新时间:2023-11-29 09:58:42 25 4
gpt4 key购买 nike

我想实现一个通用的单例工厂模式,我将所需对象的类作为参数传递,工厂类应该检查 map 是否已经为它创建了一个对象,如果是,则从 map 返回对象.如果没有,则创建一个新实例,将其放入 map 并返回该实例。

我可以将通用返回类型作为 Object,但我不想在调用 get 实例方法的每个地方都强制转换返回的对象。

下面是代码:我在 c.cast(instance);

行遇到编译错误

我们不使用 spring/依赖注入(inject),而是尝试实现通用类来创建所有单例对象。

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);
}
}

最佳答案

首先,我可以指出 <T extends Object>可以只替换为 <T>因为 Java 中涉及泛型的所有内容都必须是对象。

您真正接近的第二部分是 Class<?> c .那就是说你可以传入任何类,它会返回任何类型 T是。 c.cast(instance)可以替换为(T) instance如果您认为这看起来更好,但实际上存在差异,此处有更详细的说明:Java Class.cast() vs. cast operator .

最终代码如下所示:

public class SingletonFactory {
public static Map<String,Object> objectFactory = new HashMap<String, Object>();

public static <T> T getInstance(Class<T> c){
synchronized (c) {
String key = c.toString();
Object instance= objectFactory.get(key);
if (instance == null) {
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);
// or
return (T) instance;
}
}
}

此外,如果您真的想要,您可以保留原始代码中的所有内容并将实例转换为 T在方法的末尾,它应该可以工作。唯一的问题是您的方法调用看起来像 SingletonFactory.getInstance<Foo>(Foo.class)而不是 SingletonFactory.getInstance(Foo.class) .那是因为 Class<?>在您的原始代码中而不是 Class<T> .

编辑:我还更改了代码以更早同步,感谢@Khan9797

关于java - Singleton Factory - 使用 Java 8 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54032294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com