使用java中的Builder更新Object的特定字段



我有两个类,如下所述。我想创建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注释。

相关内容

  • 没有找到相关文章

最新更新