- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的 guice 模块中,我有多个工厂,如下所示:
install(new FactoryModuleBuilder().implement(SportsCar.class,Ferrari.class).build(FerrariFactory.class));
install(new FactoryModuleBuilder().implement(LuxuryCar.class,Mercedes.class).build(MercedesFactory.class));
两个工厂都有以下创建方法,该方法采用辅助元素:
Ferrari create(@Assisted Element partsElement);
Mercedes create(@Assisted Element partsElement);
在 CarChooser 类中,我获得了 Ferrari 或 Mercedes 的实例,如下所示:
@Inject
public CarChooser(FerrariFactory ferrariFactory , MercedesFactory mercedesFactory )
{
this.ferrariFactory = ferrariFactory;
this.mercedesFactory = mercedesFactory;
}
在同一个类(class):
if(type.equals("ferrari"))
ferrariFactory.create(partsElement);
else if (type.equals("mercedes"))
mercedesFactory.create(partsElement);
...
现在,我正在尝试使这个 CarChooser 类对扩展开放,但对修改关闭。也就是说,如果我需要添加另一个工厂,我不必将其声明为变量+将其添加到构造函数+为相应的新类型添加另一个 if 子句。我计划在这里使用 ServiceLoader 并声明一个 CarFactory 接口(interface),该接口(interface)将由所有工厂(例如 FerrariFactory、MercedesFactory 等)实现,并且所有实现都将具有 getCarType 方法。但是如何使用 Service Loader 调用 create 方法呢?
ServiceLoader<CarFactory> impl = ServiceLoader.load(CarFactory.class);
for (CarFactory fac: impl) {
if (type.equals(fac.getCarType()))
fac.create(partsElement);
}
}
如果有效的话,这是正确的方法(我什至不确定这是否有效)。或者有更好的方法来做同样的事情吗?
感谢帖子的第一条评论,我知道我想使用 MapBinder 。我写了一个 CarFactory,它由 FerrariFactory 和 MercedesFactory 扩展。所以我添加以下内容:
MapBinder<String, CarFactory> mapbinder = MapBinder.newMapBinder(binder(), String.class, CarFactory.class);
mapbinder.addBinding("Ferrari").to(FerrariFactory.class);
mapbinder.addBinding("Mercedes").to(MercedesFactory.class);
但是由于上述代码的 .to 部分是抽象类,我收到一个初始化错误,即 FerrariFactory 未绑定(bind)到任何实现。我应该在这里将其绑定(bind)到使用 FactoryModuleBuilder 声明的正确辅助注入(inject)工厂吗?
最佳答案
因此,使用 MapBinder 和泛型就是解决方案。
install(new FactoryModuleBuilder().implement(SportsCar.class,Ferrari.class).build(FerrariFactory.class));
install(new FactoryModuleBuilder().implement(LuxuryCar.class,Mercedes.class).build(MercedesFactory.class));
MapBinder<String, CarFactory<?>> mapbinder = MapBinder.newMapBinder(binder(), new TypeLiteral<String>(){}, new TypeLiteral<CarFactory<?>>(){});
mapbinder.addBinding("ferrari").to(FerrariFactory.class);
mapbinder.addBinding("mercedes").to(MercedesFactory.class);
这里要注意的重要一点是,这似乎仅在 Guice 3.0 + JDK 7 中支持。对于 JDK 8,您需要 Guice 4.0 !在https://github.com/google/guice/issues/904上发现这个问题
希望有帮助。
有关解决方案的更多详细信息:
http://crusaderpyro.blogspot.sg/2016/07/google-guice-how-to-use-mapbinder.html
关于java - 如何使用 Guice 的 AssistedInject 工厂和服务加载器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38430121/
我有一个如下所示的构造函数: @Inject public MyClass( @Named("config") String configFile, @Named("t
我刚刚开始学习Guice,但我已经遇到了一个问题。我有一个接口(interface) PlayerFactory 和一个实现 BlackjackPlayer PlayerFactory.java pu
关于 assisted injection 的页面解释了如何通过使用 @Assisted 注释构造函数中的一些参数来完成辅助注入(inject),但它没有解释 @AssistedInject 注释的用
我一直在一个项目中使用 guice。 我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂来接收参数,然后返回正确的实例。 演示代码 @Singleton public class MyF
当我运行下面的代码时,我得到输出“Bar got 1234”。看起来 Guice 找不到 num2 的绑定(bind),并隐式分配了 num1 的值。这是 AssistedInject 功能的一部分吗
我已阅读 https://github.com/google/guice/wiki/AssistedInject ,但它没有说明如何传入 AssistedInject 参数的值。 injector.g
我想在运行时使用 Hilt 为 ViewModel 提供一些依赖项。我遵循了 d.android.com this 指导的解决方案. @HiltViewModel public class Vi
我想做这样的事情: @Inject private CollectorsListHolderFactory collectorsListHolderFactory; private Collector
我正在尝试使用 Guice 3.0 AssistedInject,它不会实例化工厂。 SSCCE代码: 父类 public class ParentClass() { @Inject privat
在我的 guice 模块中,我有多个工厂,如下所示: install(new FactoryModuleBuilder().implement(SportsCar.class,Ferrari.clas
我找不到如何进行“动态辅助注入(inject)”的方法。我的意思是我想根据参数向工厂提供它需要在运行时使用的实现类名。这是我目前拥有的: interface Letter {} abstract cl
我正在使用 Guice Assisted Inject图书馆为我 build 一个工厂。我目前的设置如下: class MyObject { @Inject public MyObject(@As
我最近开始使用 Guice,需要一些帮助。 我有一个带有构造函数的类,其中包含 3 种不同的要注入(inject)的参数。下面是类 @Inject public Bullet(EntityParams
我遇到一个奇怪的错误,在使用辅助注入(inject)时我无法克服: [DEBUG] [project] - Rebinding com.gwtplatform.mvp.client.DesktopGi
什么是 Spring Framework相当于FactoryModuleBuilder , @AssistedInject , 和 @Assisted在 Google Guice ?换句话说,使用 S
我是一名优秀的程序员,十分优秀!