【问题标题】:Update specific field of Object using Builder in java在java中使用Builder更新对象的特定字段
【发布时间】:2020-07-29 19:17:10
【问题描述】:

我有两节课,如下所述。 我想创建 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 属性。但是 builder 不能很好地使用 lambda。 如果我将使用带有以下代码的 setter,它工作正常。

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

BuilderLambda

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

【问题讨论】:

  • @Builder 来自 lombok 仅用于实例化对象。另外builder是一个静态方法,你不能在对象实例上调用它。
  • @Andronicus 我可以调用obj1.builder().a3("Java").build()。但问题是只设置了a3 属性,所有剩余字段都是null。尽管obj1 中有这些字段。

标签: java builder lombok


【解决方案1】:

其实你得在注解中开启toBuilder()toBuilder() 允许您编辑当前对象。

@Builder(toBuilder = true)

然后执行obj1.toBuilder().a3("Java").build() 应该可以。

【讨论】:

    【解决方案2】:

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

    @Builder(toBuilder = true)
    

    可能就是你要找的东西

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

    boolean toBuilder() default false;
    

    【讨论】:

    • 我可以创建新的A,但我想要old object 的其他属性的所有值。
    • 您好,伙计,我遇到了 @Builder 模式的 lambda 表达式问题。
    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多