gpt4 book ai didi

java - 使用具有 "old"对象引用的 Builder 模式创建新对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:49:09 26 4
gpt4 key购买 nike

我正在研究构建器模式,但遇到了如何向新创建的对象添加新“属性”的问题:

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 字符串创建新对象?

也许我必须将旧对象引用传递给生成器,但我不知道该怎么做。也许使用 Builder 模式对于这种方法并不是很有用?

编辑:(在 Eugene 发表评论后)

想一想,我明白了:

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 构造函数将“旧”对象作为参数,并将您想要的任何内容设置为新对象。

编辑

您需要阅读更多关于构建器模式的内容,以便更好地了解它是什么以及您是否真的需要它。

一般的想法是当您有可选 元素时使用Builder 模式。 Effective Java Item 2 是你最好的 friend 。

对于你的类(class),如果你想从另一个对象构建一个对象并同时使用构建器模式,你

  1. 要么在 Builder 构造函数中传递“旧”对象
  2. 创建fromfromOld 等方法

那看起来怎么样?我将只提供第一个,您可以自己找出第二个。

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

关于java - 使用具有 "old"对象引用的 Builder 模式创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216642/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com