Java 用GoogleGuice插入列表的最佳方式是什么?

Java 用GoogleGuice插入列表的最佳方式是什么?,java,dependency-injection,guice,Java,Dependency Injection,Guice,我有三个类CircleBuilder,SquareBuilder,和TriangleBuilder实现ShapeBuilder接口 我需要初始化我的FormBuilder,尤其是BuilderList(扩展列表),每个类使用一个GoogleGuice实例 最好的方法是什么 我知道提供者的方法和类似的东西: @Provides FormBuilder provideFormBuilder() { DatabaseTransactionLog instance = new FormBuild

我有三个类
CircleBuilder
SquareBuilder
,和
TriangleBuilder
实现
ShapeBuilder
接口

我需要初始化我的
FormBuilder
,尤其是
BuilderList
(扩展
列表
),每个类使用一个GoogleGuice实例

最好的方法是什么

我知道提供者的方法和类似的东西:

@Provides
FormBuilder provideFormBuilder() {
    DatabaseTransactionLog instance = new FormBuilder ( <numerous parameters> );

    ShapeBuilder builder = null ; 
    builder = new CircleBuilder( <numerous parameters> ) ;  
    instance.addBuilder( builder ) ;

    builder = new SquareBuilder( <numerous parameters> ) ;  
    instance.addBuilder( builder ) ;

    // And so on

    return instance;
}
有什么想法吗?

考虑一下,它将收集与您的代码片段非常相似的绑定。没有通过Multibinder提供列表,因为Multibinder是为绑定到多个模块中的同一集合而设计的,并且Multibinder列表的元素顺序将取决于模块的评估顺序

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>.

我们可以这样做:-

@Override
protected void configure() {
    bind(ShapeBuilder.class).annotatedWith(Names.named("Circle")).to(CircleBuilder.class);
    bind(ShapeBuilder.class).annotatedWith(Names.named("Triangle")).to(TriangleBuilder.class);
    bind(ShapeBuilder.class).annotatedWith(Names.named("Square")).to(SquareBuilder.class);
}
在FormBuilder类中:-

class FormBuilder{
   List<ShapeBuilder> shapeBuilderList;
   @Inject
   public FormBuilder(@Named("Circle")ShapeBuilder circle, @Named("Triangle")ShapeBuilder triangle,@Named("Square")ShapeBuilder square){
       shapeBuilderList = new ArrayList<>();
       //add all of them
       shapeBuilderList.add(circle);
    }
}
类表单生成器{
列表shapeBuilderList;
@注入
公共表单生成器(@Named(“Circle”)ShapeBuilder Circle、@Named(“Triangle”)ShapeBuilder Triangle、@Named(“Square”)ShapeBuilder Square){
shapeBuilderList=新的ArrayList();
//把它们全部加起来
shapeBuilderList.add(圆形);
}
}

Note:multibinding需要另一个jar->guice-multibindings-3.0。jar我的问题(这里包括sofURL)显示了如何使用Mulitbinder,然后构造函数将“一组”具体注入到需要它们的类中(对于那些倾向于基于构造函数的注入的类)。这是多绑定用户指南的当前链接:@UzielSulkies六年过得真快!我已经更新了两个链接。谢谢你的邀请!
@Override
protected void configure() {
    bind(ShapeBuilder.class).annotatedWith(Names.named("Circle")).to(CircleBuilder.class);
    bind(ShapeBuilder.class).annotatedWith(Names.named("Triangle")).to(TriangleBuilder.class);
    bind(ShapeBuilder.class).annotatedWith(Names.named("Square")).to(SquareBuilder.class);
}
class FormBuilder{
   List<ShapeBuilder> shapeBuilderList;
   @Inject
   public FormBuilder(@Named("Circle")ShapeBuilder circle, @Named("Triangle")ShapeBuilder triangle,@Named("Square")ShapeBuilder square){
       shapeBuilderList = new ArrayList<>();
       //add all of them
       shapeBuilderList.add(circle);
    }
}