Take a look at the Robot Legs section described in the Guice FAQ. "How to create a robot with two" Leg "objects, the left one, which is entered using LeftFoot, and the right one with the right panel." But there is only one Leg class that is reused in both contexts.
There is a PrivateModules solution there. It uses two separate private modules: @Left and @Right. Each of them has a binding to the unoccupied Foot.class and Leg.class and provides a binding for the annotated Leg.class:
class LegModule extends PrivateModule { private final Class<? extends Annotation> annotation; LegModule(Class<? extends Annotation> annotation) { this.annotation = annotation; } @Override protected void configure() { bind(Leg.class).annotatedWith(annotation).to(Leg.class); expose(Leg.class).annotatedWith(annotation); bindFoot(); } abstract void bindFoot(); }
... and glue it all together:
public static void main(String[] args) { Injector injector = Guice.createInjector( new LegModule(Left.class) { @Override void bindFoot() { bind(Foot.class).toInstance(new Foot("leftie")); } }, new LegModule(Right.class) { @Override void bindFoot() { bind(Foot.class).toInstance(new Foot("righty")); } }); }
source share