2017-06-17 44 views
0

我想創建生成器類,並使用它,如下所示:注射建設者

public class SomeBean { 

@Inject 
private Builder builder; 

public void method() { 
    List<SomeObject> objects = ... ; 
    for (SomeObject object : objects) { 

     if (someConditionSatisfy()) { 
      builder.withPropertyA(object.getPropertyA); 
     } 
     builder.withPropertyB(object.getPropertyB); 
     builder.withPropertyC(object.getPropertyC); 

     BuiltObject builtObject = builder.build(); 

     someOutputList.add(builtObject); 
    } 
} 

} 

但法方法()我有有條件的if語句:

if (someConditionSatisfy()) { 
    builder.withPropertyA(object.getPropertyA); 
} 

讓我們假設在循環的第一次迭代的條件被滿足,並builder.withPropertyA()被調用方法。在第二次迭代中,條件不滿足。但第一迭代已經設置在助洗劑性能A,所以通過構建器類的構建方法創建的第二個目的也包括該屬性。我想避免這種情況。所以問題是:我應該怎麼做?我應該在創建目標對象之後「重置」其build()方法中的所有構建器字段嗎?或者我應該創建生成器的新實例每次(但我不知道如何做到這一點,並且不使用new關鍵字 - 我quess我應該從容器中獲得新的生成器實例)?

預先感謝幫助

回答

-1

您必須使用布在這種情況下,而不是注入建設者注入面料,每invokation返回新的生成器實例。這是最簡單和簡潔的解決方案。簡單地拋棄它而不是重用構建器,它簡化了您的代碼和單元測試用例。如果您出於性能的考慮處理的SomeObject大額你也許應該重用建設者,但使其面料交易,而不是創建新Builder改變面料的代碼來創建只有一個實例Builder類和create()方法復位建設者的每一個invokation,並再次返回該實例。這樣,你不需要改變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(); 
    } 
}