假设我有课程水果
class Fruit extends FruitBase {
@Inject Fruit(Type type) {...}
}
FruitBase通过方法注入注入一些东西,所以Fruit也必须通过Guice注入。
现在我需要在另一个类中注入Map<Type, Fruit>
。所以我创建了一个MapBinder
。最简单的方法是为每种类型创建一些Fruit的子类:
class Orange extends Fruit {
@Inject Orange() {
super(Type.ORANGE);
}
}
// and later
mapBinder.addBinding(Type.ORANGE).to(Orange.class);
但是,如果我不想创建一堆简单的子类,而是让MapBinder将标签I(#{1}},Type.ORANGE
)绑定到Fruit本身?所以我会:
Type.APPLE
然后我注入的Map将有两个Fruit实例:一个是ORANGE类型,另一个是APPLE。
这可能吗?
我在这里找到了一个解决方法:https://groups.google.com/d/msg/google-guice/m-m9LiVsgSM/pKVi2EIILCsJ
但是mapBinder.addBinding(Type.ORANGE).to(Fruit.class);
mapBinder.addBinding(Type.APPLE).to(Fruit.class);
只是闻起来有点气味。
答案 0 :(得分:2)
您可以使用绑定到预先创建的实例。请注意,在这种情况下,稍后将注入不是由这些实例的注入器但成员创建的实例。
mapBinder.addBinding(Type.ORANGE).toInstance(new Fruit(Type.ORANGE));
mapBinder.addBinding(Type.APPLE).toInstance(new Fruit(Type.APPLE));
但是,几个注入的地图之间会共享相同的实例,这会导致问题。