16

、、、およびインターフェイスを実装する3 つのクラスCircleBuilderがあります。SquareBuilderTriangleBuilderShapeBuilder

google-guice を使用して、各クラスの 1 つのインスタンスでmyFormBuilderと特に a BuilderList( extending ) を初期化する必要があります。List<ShapeBuilder>

最善の方法は何ですか?

私はプロバイダーメソッドと次のようなものについて知っています:

@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;
}

FormBuilderしかし、それは、guice を使用する目的を無効にする手動で作成する必要があることを意味します(これFormBuilderは、オブジェクト グラフの最上位の要素であるためです)。

次のように書けるようになりたいです。

bind(BuilderList.class).to(CircleBuilder.class);
bind(BuilderList.class).to(TriangleBuilder.class);
bind(BuilderList.class).to(SquareBuilder.class);

何か案が?

4

2 に答える 2

21

コード スニペットと非常によく似たバインディングを収集するMultibindingsを検討してください。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>.

または、メソッド@Providesパラメーター (CircleBuilderまたは などProvider<CircleBuilder>) を受け取ることができるため、リスト自体以外のすべてを Guice で作成することができます。Guice は、バインドされたすべてのタイプのプロバイダーを自動的にバインドするだけでなく、任意の@Providesメソッドにすべてのパラメーターを注入します。

@Provides List<ShapeBuilder> provideShapeBuilders(
    CircleBuilder circleBuilder,
    SquareBuilder squareBuilder,
    TriangleBuilder triangleBuilder,
    Provider<TrapezoidBuilder> trapezoidBuilderProvider) {
  return new ArrayList<ShapeBuilder>(
      circleBuilder,
      squareBuilder,
      triangleBuilder,
      trapezoidBuilderProvider.get(),
      trapezoidBuilderProvider.get());
}
于 2013-01-07T22:33:38.570 に答える