Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用生成器模式更新对象_Java_Builder - Fatal编程技术网

Java 使用生成器模式更新对象

Java 使用生成器模式更新对象,java,builder,Java,Builder,我最近发现了这种模式,并尝试将其应用到我的项目中。它做它想做的事。然而,他试图找到一个很好的解决方案来更新它。我提出了一个解决方案,我想知道它是否“可接受” 我所做的唯一区别是,我在Builder类中创建了另一个构造函数,该构造函数将调用对象作为参数: public Builder (User user) { this.userID = user.getUserID(); this.userName = user.getUserName(); ... //and

我最近发现了这种模式,并尝试将其应用到我的项目中。它做它想做的事。然而,他试图找到一个很好的解决方案来更新它。我提出了一个解决方案,我想知道它是否“可接受”

我所做的唯一区别是,我在Builder类中创建了另一个构造函数,该构造函数将调用对象作为参数:

public Builder (User user) {
    this.userID = user.getUserID();
    this.userName = user.getUserName();
    ...
    //and so on
主要方法是

创建对象:

User user = new User.Builder("mandatory params")
                    .email("some email")
                    .build();
和更新:

user = new User.Builder(user).phoneNumber("my number").build();

这种做法是否可以接受

当对象为空或部分填充时,应该使用setter和getter,这无关紧要


另外,在我看来,使用
objectMapper
比使用builder模式更好。它可以自动处理新参数,而无需在builder模式中添加额外的代码行,而且更
clean code
,如果您想创建一个新用户,并使用从其他用户复制的字段,这很好,但需要做一些更改:

anotherUser = new User.Builder(user).phoneNumber("my number").build();

但是,如果将新对象分配回
user
变量,则表明您正在更新现有用户。要更新,您需要创建一个全新的对象并复制字段,这是非常低效的。你应该使用setter。

如果我理解正确,即使你的对象是由10个参数组成的,也最好使用setter。@EduardasŠlutas我认为在一个内存位置更新某些内容几乎总是比设置一个新的内存位置更有效。例如,在需要将int数组的所有元素(数千个)设置为0的情况下,创建新对象可能更有效。使用setters 1。超出了封装2的目的。超出了buillder的目的,它应该验证在创建或更新之后是否保留了一些复杂的配置。它省去了为不可变对象实现构建器的所有工作。有些人喜欢龙目山也是出于同样的原因。(我与这两个项目都没有关系,只是一个不可变的快乐用户)。你真的认为你在用构建器节省打字和提高可读性吗?现在代码是任意缩进的,人们会滥用长行,因此换行样式会在重新格式化中弄乱所有内容。。同时,您必须编写生成器和get/set。保养太多了。