Обновите поле c для Object с помощью Builder в java - PullRequest
1 голос
/ 16 апреля 2020

У меня есть два класса со мной, как упомянуто ниже. Я хотел создать два экземпляра class A.

Я хочу создать экземпляр obj2 из существующего экземпляра obj1 с обновленным значением атрибута 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 атрибуты всех элементов в списке с помощью компоновщика. Но строитель не работает нормально с лямбда. Если я буду использовать сеттер с кодом ниже, он работает нормально.

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

Я не могу получить обновленные значения для a1 and a2 в случае Builder с Lambda

Ответы [ 2 ]

3 голосов
/ 16 апреля 2020

obj1.builder() - допустимый, но запутанный способ сказать A.builder(). Не рекомендуется вызывать метод stati c для экземпляра. В любом случае, будет создан совершенно новый A.

@Builder(toBuilder = true)

может быть тем, что вы ищете

Если true, сгенерируйте метод экземпляра, чтобы получить конструктор, который инициализируется со значениями этого экземпляра. Допустимо, только если @Builder используется в конструкторе, в самом типе или в методе stati c, который возвращает экземпляр объявленного типа.

boolean toBuilder() default false;
1 голос
/ 16 апреля 2020

На самом деле, вы должны включить toBuilder() в аннотации. toBuilder() позволяет редактировать текущий объект.

@Builder(toBuilder = true)

, а затем выполнение obj1.toBuilder().a3("Java").build() должно работать.

...