Java 可注射助凝剂

Java 可注射助凝剂,java,cdi,builder,inject,Java,Cdi,Builder,Inject,我希望创建生成器类并按如下方式使用它: public class SomeBean { @Inject private Builder builder; public void method() { List<SomeObject> objects = ... ; for (SomeObject object : objects ) { if (someConditionSatisfy()) { builder.wi

我希望创建生成器类并按如下方式使用它:

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

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


提前感谢您的帮助

在这种情况下,您必须使用fabric,而不是inject builder inject fabric,它为每次调用返回新的生成器实例。这是最简单、简洁的解决方案。它不是重用构建器,而是简化代码和单元测试用例。如果出于性能原因处理大量的
SomeObject
,您可能应该重用builder,但要使其成为fabric deal,而不是创建新的
builder
更改fabric代码,以便只创建
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();
    }
}
公共类SomeBean{
@注入
私人建筑材料建筑材料;
公开作废法(){
列出对象=;
对于(SomeObject对象:对象){
Builder=builderFabric.create();
if(someConditionConfect()){
builder.withPropertyA(object.getPropertyA);
}
builder.withPropertyB(object.getPropertyB);
builder.withPropertyC(object.getPropertyC);
BuilObject BuilObject=builder.build();
添加(BuilObject);
} 
}
}
公共类构建器{
公共生成器创建(){
返回新的生成器();
}
}
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();
    }
}