Java guice能为我创建一个工厂吗?
我有以下工厂课程:Java guice能为我创建一个工厂吗?,java,guice,factory,Java,Guice,Factory,我有以下工厂课程: public class MessagePresenterCreator implements IPresenterFactory{ @Override public MessagePresenter createPresenter(Message m) { if (m instanceof Letter) { return new LetterPresenter(); } if (m i
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();
}
}
我是否可以通过以下接口配置GUI以自动生成和提供此类工厂:
public interface IPresenterFactory {
public abstract MessagePresenter createPresenter(Message m);
}
没有一个guice没有像这样的内置工厂。您可以编写一个采用
Map的工厂,没有guice没有内置这样的工厂。您可以编写一个采用Map的工厂,我喜欢用两种方式来看待工厂——只从组件组装对象的工厂和在组装中执行条件逻辑的工厂
你们的工厂背后有逻辑。Guice无法自动执行该逻辑,因为它只是处理依赖项的连接。如果您创建的类型需要注入一定数量的依赖项,并且在创建时提供了一些东西,那么工厂的自动连接就可以通过guice来完成。这将允许您提供一个工厂接口,用@AssistedInject注释所创建类型中的任何字段,guice的扩展将创建一个工厂实现类,该类将注入注入器中绑定的任何内容,并传递这些create()参数。但在这种情况下,Guice和AssistedInject所做的一切都是将各个部分组装在一起——根据事先指定的配方将它们连接起来。它不是在最后一刻做出决定
您正在提供对象的有条件创建。那是行不通的
提到创建依赖于类型到presenter的映射的工厂-类似于:
Map<Class<? extends Message>, Class<? extends MessagePresenter>>
Map我喜欢用两种方式来考虑工厂——只从组件组装对象的工厂和在组件中执行条件逻辑的工厂
你们的工厂背后有逻辑。Guice无法自动执行该逻辑,因为它只是处理依赖项的连接。如果您创建的类型需要注入一定数量的依赖项,并且在创建时提供了一些东西,那么工厂的自动连接就可以通过guice来完成。这将允许您提供一个工厂接口,用@AssistedInject注释所创建类型中的任何字段,guice的扩展将创建一个工厂实现类,该类将注入注入器中绑定的任何内容,并传递这些create()参数。但在这种情况下,Guice和AssistedInject所做的一切都是将各个部分组装在一起——根据事先指定的配方将它们连接起来。它不是在最后一刻做出决定
您正在提供对象的有条件创建。那是行不通的
提到创建依赖于类型到presenter的映射的工厂-类似于:
Map<Class<? extends Message>, Class<? extends MessagePresenter>>
Map您是否在询问Guice是否能够计算出将消息转换为消息呈现者所需的逻辑?然后是否。我问是否可以配置guice模块,该模块将映射字母->LetterPresenter等,guice将为我创建工厂。您是在问guice是否可以计算出将消息转换为消息呈现者所需的逻辑?然后没有。我问我是否可以配置一个guice模块,该模块将映射Letter->LetterPresenter等,guice将为我创建工厂。hmmm,我正在尝试绑定地图,但它根本不工作。我喜欢该功能,但似乎无法使其工作。hmmm,我正试图通过绑定地图来实现这一点,但它根本不起作用。我喜欢这个功能,但似乎无法让它发挥作用。
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);