У вас есть несколько вариантов здесь.
1. , так как вы используете enum
для различения реализаций, тогда у вас есть конечное число реализаций, которые вы можете определить с помощью ихсобственная привязка, при условии, что вы используете аннотацию во время инъекции
public @interface SomeInterfaceKind {
MyObjects value();
}
в вашем Module
:
bind(SomeInterface.class)
.annotatedWith(new SomeInterfaceKindImpl(MyObjects1.OBJECT1)
.to(Object1.class);
...
Затем в классы для инъекции:
@Inject void setSomeInterface(
@SomeInterfaceKind(MyObjects.OBJECT1) SomeInterface object) {...}
Здесь вы должны определить класс SomeInterfaceKindImpl
, который реализует SomeInterfaceKind
(да, можно расширить аннотацию!). Для получения более подробной информации, посмотрите, как Named
реализован в Guice.
2. Вы также можете использовать Guice MapBinder следующим образом (я считаю, что его проще реализовать)
В вашем модуле:
MapBinder.newMapBinder(MyObjects.class, SomeInterface.class)
.addBinding(MyObjects.OBJECT1).to(Object1.class);
MapBinder.newMapBinder(MyObjects.class, SomeInterface.class)
.addBinding(MyObjects.OBJECT2).to(Object2.class);
Затем в инжектеметоды:
@Inject void setSomeInterface(Map<MyObjects, SomeInterface> map) {
SomeInterface object1 = map.get(MyObjects.OBJECT1);
...
}