我有两个类,如下所述。我想创建class A
的两个实例。
我想从现有实例obj1创建实例obj2,其中a3属性的更新值为"Java"
。
我曾尝试过使用Builder进行离线操作,但不起作用。
A obj2 = obj1.builder().a3("Java").build();
我可以通过调用构造函数来实现,但我只想实现Builder
模式。
@Builder
@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()});
A obj3 = obj1.toBuilder().a3("Java").build();
}
}
}}
正如更新的代码中所提到的,我有A的列表,我想使用生成器更新列表中所有元素的a1 and a2
属性。但生成器在lambda上运行不好。如果我将使用setter和下面的代码,它工作得很好。
list.forEach(a -> {
a.setA1("newA1");
a.setA2("newA2");
});
我无法获得a1 and a2
的更新值,如果Builder
带有Lambda
obj1.builder()
是一种允许但令人困惑的A.builder()
表达方式。不建议在实例上调用静态方法。无论哪种方式,都将创建一个全新的A
。
@Builder(toBuilder = true)
可能就是你想要的
如果为true,则生成一个实例方法以获得用该实例的值初始化的生成器。仅当
@Builder
用于构造函数、类型本身或返回声明类型实例的静态方法时才合法。boolean toBuilder() default false;
实际上,您必须在注释中启用toBuilder()
。toBuilder()
允许您编辑当前对象。
@Builder(toBuilder = true)
然后进行CCD_ 14应该工作。
使用lombok Builder方法无法更新现有对象中的字段。正如很少有人建议的toBuilder = true
一样,它创建了一个全新的对象,但不更新现有的对象。
唯一的方法是使用@Setter
注释。