繁体   English   中英

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

[英]Update specific field of Object using Builder in java

我有两个 class 如下所述。 我想创建两个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 列表,我想使用 builder 更新列表中所有元素的a1 and a2属性。 但是构建器无法正常使用 lambda。 如果我将使用带有以下代码的 setter,它工作正常。

list.forEach(a -> {
a.setA1("newA1");
a.setA2("newA2");
});

在使用LambdaBuilder的情况下,我无法获取a1 and a2的更新值

obj1.builder()是一种允许但令人困惑的说法A.builder() 不建议在实例上调用 static 方法。 无论哪种方式,都会创建一个全新A

@Builder(toBuilder = true)

可能是你要找的

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

 boolean toBuilder() default false;

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

@Builder(toBuilder = true)

然后做obj1.toBuilder().a3("Java").build()应该可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM