gpt4 book ai didi

java - guice 可以为我创建一个工厂吗?

转载 作者:行者123 更新时间:2023-11-29 08:07:51 25 4
gpt4 key购买 nike

我有以下工厂类:

public class MessagePresenterCreator implements IPresenterFactory{
@Override
public MessagePresenter createPresenter(Message m) {
if (m instanceof Letter) {
return new LetterPresenter();
}
if (m instanceof Cable) {
return new CablePresenter();
}
if (m instanceof Postcard) {
return new PostcardPresenter();
}
throw new IllegalArgumentException();
}
}

我可以配置一个 guice 来通过以下接口(interface)自动生成和提供这样的工厂吗:

public interface IPresenterFactory {
public abstract MessagePresenter createPresenter(Message m);
}

最佳答案

我喜欢以两种方式来思考工厂——仅从组件组装对象的工厂,以及在该组装中执行条件逻辑的工厂。

您的工厂背后有逻辑。 Guice 无法自动化该逻辑,因为它只是处理依赖项的连接。如果您创建的类型需要一定数量的注入(inject)依赖项和一些仅在创建时提供的东西,那么可以使用 guice 的 AssistedInject extension 完成工厂的 Autowiring 。 .这将允许您提供一个工厂接口(interface),使用@AssistedInject 注释创建的类型中的任何字段,并且 guice 的扩展将创建一个工厂实现类,该类将注入(inject)注入(inject)器中绑定(bind)的任何内容,并传递那些 create() 参数。但在这种情况下,Guice 和 AssistedInject 所做的只是将各个部分拼凑在一起——根据预先指定的配方连接起来。它不会在最后一刻做出有关它们的决定。

您正在提供对象的条件创建。那是行不通的。

An idea above提到制作一个依赖于类型映射到演示者的工厂——类似于:

Map<Class<? extends Message>, Class<? extends MessagePresenter>> 

如果将它与 Multibinder 的 MapBindings 结合使用,这是一个很好的方法. (我得加强那些文档……嗯)

使用这种方法,您可以创建一个可扩展的工厂 - 定义 Message -> MessagePresenter 子类的初始映射,但为以后的其他映射留出可能性,而无需更改您的工厂 - 只需在 multibinder 上绑定(bind)更多映射,就像这样:

 MapBinder<String, Snack> mapbinder = MapBinder.newMapBinder(
binder(),
new TypeLiteral<Class<? extends Message>>(){},
new TypeLiteral<Class<? extends MessagePresenter>>(){});
mapbinder.addBinding(MyMessage.class).toInstance(MyMessagePresenter.class);
mapbinder.addBinding(YourMessage.class).toInstance(YourMessagePresenter.class);

您可以在任意多个模块中执行此操作,添加更多类型以在它们之间切换,使用映射。

关于java - guice 可以为我创建一个工厂吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9925011/

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