gpt4 book ai didi

java - 如何在 Java 中使用泛型实现工厂模式?

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:44 24 4
gpt4 key购买 nike

我有一个通用接口(interface)Handler

public interface Handler<T> {
void handle(T obj);
}

我可以有这个接口(interface)的 n 个实现。假设我现在有以下 2 个实现。一个处理 String 对象,另一个处理 Date

public class StringHandler implements Handler<String> {
@Override
public void handle(String str) {
System.out.println(str);
}
}

public class DateHandler implements Handler<Date> {
@Override
public void handle(Date date) {
System.out.println(date);
}
}

我想写一个工厂,它将根据类类型返回处理程序实例。像这样:

class HandlerFactory {
public <T> Handler<T> getHandler(Class<T> clazz) {
if (clazz == String.class) return new StringHandler();
if (clazz == Date.class) return new DateHandler();
}
}

我在这个工厂中遇到以下错误:

Type mismatch: cannot convert from StringHandler to Handler<T>

如何解决这个问题?

最佳答案

简单的解决方案

您可以保存映射 Class<T> -> Handler<T>Map .像这样的东西:

Map<Class<T>, Handler<T>> registry = new HashMap<>();

public void registerHandler(Class<T> dataType, Class<? extends Handler> handlerType) {
registry.put(dataType, handlerType);
}

public <T> Handler<T> getHandler(Class<T> clazz) {
return registry.get(clazz).newInstance();
}

在某个地方,初始化处理程序(可能在工厂本身):

factory.registerHandler(String.class, StringHandler.class);
factory.registerHandler(Date.class, DateHandler.class);

在另一个地方,您创建并使用它们:

Handler<String> stringhandler = factory.getHandler(String.class);
Handler<Date> dateHandler = factory.getHandler(Date.class);

更复杂的解决方案

您可以使用反射“扫描”类,而不是手动注册映射 Class<T> -> Handler<T> ,使用反射来完成。

for (Class<? extends Handler> handlerType : getHandlerClasses()) {
Type[] implementedInterfaces = handlerType.getGenericInterfaces();
ParameterizedType eventHandlerInterface = (ParameterizedType) implementedInterfaces[0];
Type[] types = eventHandlerInterface.getActualTypeArguments();
Class dataType = (Class) types[0]; // <--String or Date, in your case
factory.registerHandler(dataType, handlerType);
}

然后,您可以像上面那样创建和使用它们:

Handler<String> stringhandler = factory.getHandler(String.class);
Handler<Date> dateHandler = factory.getHandler(Date.class);

实现getHandlerClasses() ,看this扫描 jar 中的所有类.对于每个类,您必须检查它是否是 Handler :

if (Handler.class.isAssignableFrom(scanningClazz) //implements Handler
&& scanningClazz.getName() != Handler.class.getName()) //it is not Handler.class itself
{
//is a handler!
}

希望对您有所帮助!

关于java - 如何在 Java 中使用泛型实现工厂模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34291714/

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