【发布时间】:2020-05-05 14:43:08
【问题描述】:
我有两节课,如下所述。
我想创建 class A 的两个实例。
我想从现有实例 obj1 创建实例 obj2,并将 a3 属性的更新值为 "Java"。
我曾尝试使用 Builder 在下一行,但它不起作用。
A obj2 = obj1.builder().a3("Java").build();
我可以通过调用构造函数来做到这一点,但我只想做到 Builder 模式。
@Builder(toBuilder = true)
@Data
class A {
String a1;
String a2;
String a3;
B b;
A(String b1, String b2, String b3, B b) {
this.a1 = b1;
this.a2 = b2;
this.a3 = b3;
this.b = b;
}
}
@Builder
@Data
class B {
String b1;
String b2;
String b3;
B(String b1, String b2, String b3) {
this.b1 = b1;
this.b2 = b2;
this.b3 = b3;
}
}
class Main {
public static void main(String[] args) {
B b = new B("a", "b", "b");
A obj1 = new A("a1", "b1", "b1", b);
A obj2 = new A("x1", "y1", "z1", b);
List<A> list= new ArrayList<>();
list.add(obj1);
list.add(obj2);
list.forEach(a -> {
a.toBuilder().a1("newA1").a2("newA2").build();
repository.save(a);
});
A obj3 = obj1.toBuilder().a3("Java").build();
}
}
如更新代码中所述,我有 A 列表,我想使用构建器更新列表中所有元素的 a1 and a2 属性。但是 builder 不能很好地使用 lambda。
如果我将使用带有以下代码的 setter,它工作正常。
list.forEach(a -> {
a.setA1("newA1");
a.setA2("newA2");
});
在 Builder 和 Lambda
a1 and a2 的更新值
【问题讨论】:
-
创建现有对象的更新版本根本不是
Builder的用例。有一个实验性的Wither可以用于此目的。 -
原来
Wither被重命名为With并在 Lombok 1.18.10 中退出实验:With。 -
@DavidConrad 这是一个用例,Lombok 支持它。
-
@Michael 我忘记了
toBuilder,因为我自己从不使用它。我赞成你的回答。
标签: java java-8 builder lombok