在java中使用Builder更新对象的特定字段

在java中使用Builder更新对象的特定字段,java,builder,lombok,Java,Builder,Lombok,我有两门课,如下所述。 我想创建两个A类的实例 我想从现有实例obj1创建实例obj2,更新后的a3属性值为“Java” 我曾尝试使用生成器进行线下操作,但不起作用 A obj2 = obj1.builder().a3("Java").build(); 我可以通过调用构造函数来实现,但我只想通过模式来实现 @Builder @Data class A { String a1; String a2; String a3; B b; A(String b1

我有两门课,如下所述。 我想创建两个
A类的实例

我想从现有实例obj1创建实例obj2,更新后的a3属性值为“Java”

我曾尝试使用生成器进行线下操作,但不起作用

A obj2 = obj1.builder().a3("Java").build();
我可以通过调用构造函数来实现,但我只想通过模式来实现

@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();
    }
}

如果使用
使用
我无法获取
a1和a2的更新值实际上,您必须在注释中启用
toBuilder()
toBuilder()
允许您编辑当前对象

@Builder(toBuilder=true)

然后执行
obj1.toBuilder().a3(“Java”).build()
应该可以工作。

实际上,您必须在注释中启用
toBuilder()
toBuilder()
允许您编辑当前对象

@Builder(toBuilder=true)
然后执行
obj1.toBuilder().a3(“Java”).build()
应该可以。

obj1.builder()
是一种允许但令人困惑的方式来表示
A.builder()
。不建议对实例调用静态方法。无论哪种方式,都将创建一个全新的
a

@Builder(toBuilder = true)
可能就是你要找的

如果为true,则生成一个实例方法,以获取使用此实例的值初始化的生成器。仅当构造函数、类型本身或返回声明类型实例的静态方法上使用了
@Builder
时才合法

boolean toBuilder() default false;
obj1.builder()
是一种允许但容易混淆的表达
A.builder()
的方式。不建议对实例调用静态方法。无论哪种方式,都将创建一个全新的
a

@Builder(toBuilder = true)
可能就是你要找的

如果为true,则生成一个实例方法,以获取使用此实例的值初始化的生成器。仅当构造函数、类型本身或返回声明类型实例的静态方法上使用了
@Builder
时才合法

boolean toBuilder() default false;

lombok的
@Builder
仅用于实例化对象。除了
builder
是一个静态方法外,您不能在对象实例上调用它。@Andronicus我可以调用
obj1.builder().a3(“Java”).build()
。但问题是,只设置了属性
a3
,其余所有字段都是
null
。即使lombok的
obj1
@Builder
中有这些字段,它们也仅用于实例化对象。除了
builder
是一个静态方法外,您不能在对象实例上调用它。@Andronicus我可以调用
obj1.builder().a3(“Java”).build()
。但问题是,只设置了属性
a3
,其余所有字段都是
null
。即使那些字段在
obj1
中。我可以创建新的
A
,但我想要
旧对象的其他属性的所有值。你好,伙计,我面临@Builder模式的lambda表达式问题。我可以创建新的
A
,但是我想要
旧对象的其他属性的所有值。你好,伙计,我面临着@Builder模式的lambda表达式的问题。