2017-06-17 29 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(); 
    } 
}