Tiene varias opciones aquí.
1. ya que se utiliza un enum
distinguir entre implementaciones, entonces usted tiene un número finito de las implementaciones que se pueden definir cada uno con su propia unión, siempre y cuando use una anotación durante la inyección
public @interface SomeInterfaceKind {
MyObjects value();
}
en su Module
:
bind(SomeInterface.class)
.annotatedWith(new SomeInterfaceKindImpl(MyObjects1.OBJECT1)
.to(Object1.class);
...
Luego, en las clases a inyectar:
@Inject void setSomeInterface(
@SomeInterfaceKind(MyObjects.OBJECT1) SomeInterface object) {...}
Aquí hay que definir SomeInterfaceKindImpl
clase que implementa SomeInterfaceKind
(sí, es posible extender una anotación!) Para más detalles, echa un vistazo a cómo se implementa en Named
Guice.
2. También puede utilizar Guice MapBinder de la siguiente manera (me resulta más sencillo de implementar)
en el módulo:
MapBinder.newMapBinder(MyObjects.class, SomeInterface.class)
.addBinding(MyObjects.OBJECT1).to(Object1.class);
MapBinder.newMapBinder(MyObjects.class, SomeInterface.class)
.addBinding(MyObjects.OBJECT2).to(Object2.class);
Luego, en métodos inyectadas:
@Inject void setSomeInterface(Map<MyObjects, SomeInterface> map) {
SomeInterface object1 = map.get(MyObjects.OBJECT1);
...
}
gracias por la respuesta. Según tengo entendido, la primera opción es más apropiada cuando en tiempo de compilación se conoce la clase real, mientras que la segunda opción permite la decisión en el tiempo de ejecución qué implementación usar. –