我最近发现了这个模式并尝试将其实现到我的项目中。它做了它想做的事情。但是,试图找到一个很好的解决方案来更新它。提出了一个解决方案,我想知道它是否“可接受”。
我做的只有一个区别是我在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();
这种方法可以接受吗?
如果您想要创建一个新用户,其中包含从其他用户复制的字段,并进行一些更改,这是很好的:
anotherUser = new User.Builder(user).phoneNumber("my number").build();
但是,如果要将新对象分配回user
变量,则表明您正在更新现有用户。要进行更新,您将创建一个全新的对象并复制字段,这是非常低效的。你应该使用setter。
一旦你把对象弄空或者部分填充并不重要,你应该设置setter和getter。
另外在我看来,最好使用jackson objectMapper
与构建器模式进行比较,它会自动处理新参数,而不会在构建器模式中添加额外的代码行,而且还有更多的clean code
。