2017-06-17 3 views
0

ループの最初の反復で条件が満たされ、builder.withPropertyA()メソッドが呼び出されます。第2の反復では、条件は満たされない。しかし、最初の反復では既にビルダーにプロパティAが設定されているため、ビルダークラスのビルドメソッドで作成された2番目のオブジェクトにはこのプロパティも含まれています。私はこの場合を避けたいと思います。だから問題は:どうすればいいのですか?ターゲットオブジェクトが作成された後、build()メソッド内のすべてのBuilderフィールドを「リセット」する必要がありますか?あるいは、毎回Builderの新しいインスタンスを作成する必要があります(ただし、これを行う方法がわからず、新しいキーワードを使用しないでください。コンテナから新しいBuilderインスタンスを取得する必要があります)。ヘルプ注射ビルダー

答えて

-1

を事前に

ありがとうございますではなく、すべてのinvokationのための新しいビルダーインスタンスを返すビルダー注入生地を注入し、この場合にはファブリックを使用する必要があります。これは最も簡単で簡潔なソリューションです。 Builderを再利用するのではなく、コードと単体テストのケースを単純化します。パフォーマンスの理由から大量のSomeObjectを処理する場合は、Builderを再利用する必要がありますが、ファブリックの取引を行う必要があります。Builderファブリックコードを変更してBuilderクラスのインスタンスを1つだけ作成し、create()メソッドのビルダーをリセットし、 。このようにして、SomeBeanクラスのコードを変更する必要はありません。

public class SomeBean { 

@Inject 
private BuilderFabric builderFabric; 

public void method() { 
    List<SomeObject> objects = ... ; 
    for (SomeObject object : objects) { 
     Builder builder = builderFabric.create(); 
     if (someConditionSatisfy()) { 
      builder.withPropertyA(object.getPropertyA); 
     } 
     builder.withPropertyB(object.getPropertyB); 
     builder.withPropertyC(object.getPropertyC); 

     BuiltObject builtObject = builder.build(); 

     someOutputList.add(builtObject); 
    } 
} 

} 

public class BuilderFabric { 

    public Builder create() { 
     return new Builder(); 
    } 
}