Consider Multibindings , which will collect bindings very similar to your piece of code. There are no lists for Multibinder, since Multibinder is designed to bind to the same collection in several modules, and the order of elements in the Multibinder list will depend on the order in which your modules were evaluated.
Multibinder<ShapeBuilder> shapeBinder = Multibinder.newSetBinder(binder(), ShapeBuilder.class); shapeBinder.addBinding().to(CircleBuilder.class); shapeBinder.addBinding().to(TriangleBuilder.class); shapeBinder.addBinding().to(SquareBuilder.class); // Now you can inject Set<ShapeBuilder>.
Alternatively, your @Provides method can take parameters (e.g. CircleBuilder or Provider<CircleBuilder> ), so you can force Guice to create everything except the list itself. Guice not only automatically binds providers of all related types, but also @Provides every parameter in any @Provides method.
@Provides List<ShapeBuilder> provideShapeBuilders( CircleBuilder circleBuilder, SquareBuilder squareBuilder, TriangleBuilder triangleBuilder, Provider<TrapezoidBuilder> trapezoidBuilderProvider) { return new ArrayList<ShapeBuilder>( circleBuilder, squareBuilder, triangleBuilder, trapezoidBuilderProvider.get(), trapezoidBuilderProvider.get()); }
Jeff bowman
source share