我正在尝试构建器模式,并陷入如何向新创建的对象添加新“属性”的困境:
public class MsProjectTaskData {
private boolean isAlreadyTransfered;
private String req;
public static class Builder {
private boolean isAlreadyTransfered = false;
public Builder withTransfered(boolean val) {
isAlreadyTransfered = val;
return this;
}
public MsProjectTaskData build() {
return new MsProjectTaskData(this);
}
}
private MsProjectTaskData(Builder builder) {
isAlreadyTransfered = builder.isAlreadyTransfered;
}
public MsProjectTaskData(String req) {
this.req = req;
}
}
我可以使用 Builder 创建一个新对象,如下所示:
MsProjectTaskData data = new MsProjectTaskData.Builder().withTransfered(true).build();
但通过这种方法req
新创建的对象中的字符串会丢失(当然)。
是否有可能用新集合创建一个新对象isAlreadyTransfered
变量和与“旧”req
来自“旧”对象的字符串?
也许我必须将旧对象引用传递给生成器,但我不知道该怎么做。也许使用构建器模式对于这种方法来说并不是真正有用?
编辑:(尤金评论后)
想一想,我明白了:
public static class Builder {
private boolean isAlreadyTransfered = false;
private MsProjectTaskData data;
public Builder(MsProjectTaskData data) {
this.data = data;
}
public Builder withTransfered(boolean val) {
isAlreadyTransfered = val;
data.setAlreadyTransfered(isAlreadyTransfered);
return this;
}
public MsProjectTaskData build() {
return data;
}
}
似乎有效还是上面的代码有问题?我可以不加考虑地使用这种方法吗?
让 Builder 构造函数将“旧”对象作为参数,并将您想要的任何内容设置为新对象。
Edit
您需要阅读更多有关构建器模式的内容,以便更好地掌握它是什么以及您是否really需要它。
一般的想法是,当您有以下情况时,使用构建器模式optional元素。在这方面,Effective Java Item 2 是您最好的朋友。
对于您的类,如果您想从另一个对象构建一个对象并同时使用构建器模式,您可以
- 要么在 Builder 构造函数中传递“旧”对象
- 创建一个方法from or fromOld, etc.
那看起来怎么样?我将只提供第一个,您可以自己找出第二个。
class MsProjectTaskData {
private final String firstname;
private final String lastname;
private final int age;
private MsProjectTaskData(Builder builder){
this.firstname = builder.firstname;
this.lastname = builder.lastname;
this.age = builder.age;
}
public static final class Builder{
//fields that are REQUIRED must be private final
private final String firstname;
private final String lastname;
//fields that are optional are not final
private int age;
public Builder(String firstname, String lastname){
this.firstname = firstname;
this.lastname = lastname;
}
public Builder(MsProjectTaskData data){
this.firstname = data.firstname;
this.lastname = data.lastname;
}
public Builder age(int val){
this.age = val; return this;
}
public MsProjectTaskData build(){
return new MsProjectTaskData(this);
}
}
public String getFirstname() {
return firstname;
}
public String getLastname() {
return lastname;
}
public int getAge() {
return age;
}
}
以及如何从另一个对象创建一个对象:
MsProjectTaskData.Builder builder = new MsProjectTaskData.Builder("Bob", "Smith");
MsProjectTaskData oldObj = builder.age(23).build();
MsProjectTaskData.Builder newBuilder = new MsProjectTaskData.Builder(oldObj);
MsProjectTaskData newObj = newBuilder.age(57).build();
System.out.println(newObj.getFirstname() + " " + newObj.getLastname() + " " + newObj.getAge()); // Bob Smith 57
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)