gpt4 book ai didi

Java Factory 在传递的类型上创建泛型参数化

转载 作者:行者123 更新时间:2023-11-30 06:53:03 25 4
gpt4 key购买 nike

我宿醉了,今天特别慢。

我想将 Intent 的子类传递给某个工厂,并取回 Handler<? extends Intent> ,其中参数化类型与传递给工厂的参数类型匹配。

public interface HandlerFactory
{
<I extends Intent> Handler<I> build(I intent);
}

我正在为这个的实现而苦苦挣扎。我不想 if/else 检查所有不同类型的 Intent ,然后为每个创建适当的 Handler<> ,并根据我们最终进入的条件 block 来转换它。我不想使用访问者模式的一些变体,因为那时我的工厂与 Intent/Handler<? extends Intent>每个子类耦合。更“可插入”的东西似乎是可取的。

如果不进行一些肮脏的转换,我该如何实现呢?下面的简化案例无法编译,因为虽然 OrgHandler 实现了 Handler<OrgIntent>,但编译器不知道传递的 Intent ( I ) 是 OrgIntent 而不是任何其他子类。

public class SimpleHandlerFactory implements HandlerFactory
{
@Override
public <I extends Intent> Handler<I> build(I intent)
{
// Filthy conditional that I want to avoid
if(intent instanceof OrgIntent)
{
// Cast seems wrong
return (Handler<I>) new SimpleOrgHandler(intent);
}
else if(intent instanceof SomeOtherIntent)
{
...
}
}

更新

客户端代码有一个 List<Intent>,并不真正关心子类型;它需要构建一个 List<Handler>(我想我需要在那里进行原始类型抑制),然后对每个类型调用一个方法。

List<Intent> intents = orderedIntentBuilder.getOrderedIntents(declaration);
for(Intent intent : intents)
{
Handler<Intent> handler = handlerFactory.build(intent);
handler.resolve(someUnimportantArg);
}

最佳答案

我在这里看到了循环依赖的可能性。您想从 Intent 转到 Handler,而 Intent 不应该知道 Handler,并且 Handler 已经知道 Intent

人们还想知道为什么一个类需要一个专用处理程序,那么处理程序功能不应该由类本身的一部分来实现吗?


不管怎样,一个简单的方法是向Intent 添加一个getHandler 方法:

interface Handler<T extends Intent> {}

interface Intent {
Handler<?> getHandler();
}

class OrgIntent {
@Override
public Handler<OrgIntent> getHandler() {
return new SimpleOrgHandler(this);
}
}

...
List<Intent> intents = orderedIntentBuilder.getOrderedIntents(declaration);
for(Intent intent : intents)
{
Handler<?> handler = intent.getHandler();
handler.resolve(someUnimportantArg);
}

这确实在 IntentHandler 之间创建了循环依赖关系。你可以接受,但也有一种方法可以解决这个问题。


通过将处理程序操作的数据“模型”提取到第三类:

interface IntentModel {...}

Handler 现在在此模型上运行,而不是 Intent 本身。

class OrgIntent {    
@Override
public Handler<OrgIntentModel> getHandler() { // <-- Handler<OrgIntentModel>
return new SimpleOrgHandler(this.model); // passing only model
}
}

创建依赖关系:

Intent -> IntentModel
Intent -> Handler
Handler -> IntentModel

在这种情况下,您可能希望将 Handler 功能与 IntentModel 合并。那里不会有循环依赖关系,因为模型只对自身进行操作。

关于Java Factory 在传递的类型上创建泛型参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37989174/

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