【问题标题】:Injectable builder可注射的生成器
【发布时间】:2017-06-17 13:54:36
【问题描述】:

我想创建构建器类并按如下方式使用它:

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

}

但在方法 method() 中我有条件 if 语句:

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

让我们假设在循环的第一次迭代中满足条件并且调用了 builder.withPropertyA() 方法。在第二次迭代中,条件不满足。但是第一次迭代已经在builder中设置了属性A,所以builder类的build方法创建的第二个对象也包含这个属性。我想避免这种情况。所以问题是:我该怎么做?创建目标对象后,我是否应该“重置”其 build() 方法中的所有构建器字段?还是我应该每次都创建新的 Builder 实例(但我不知道怎么做,也不使用 new 关键字——我想我应该从容器中获取新的 builder 实例)?

提前感谢您的帮助

【问题讨论】:

    标签: java cdi builder inject


    【解决方案1】:

    在这种情况下,您必须使用结构,而不是注入构建器注入结构,该结构会为每次调用返回新的构建器实例。这是最简单和简洁的解决方案。与其将重用构建器简单地扔掉,不如简化您的代码和单元测试用例。如果您出于性能原因处理大量SomeObject,您可能应该重用构建器但使其成为结构交易,而不是创建新的Builder更改结构代码以仅创建Builder类的一个实例以及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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      相关资源
      最近更新 更多