Создайте объект из существующего с помощью ломбока

Допустим, у меня есть аннотированный класс lombok, например

@Builder
class Band {
   String name;
   String type;
}

Я знаю, что могу сделать:

Band rollingStones = Band.builder().name("Rolling Stones").type("Rock Band").build();

Есть ли простой способ создать объект Foo с использованием существующего объекта в качестве шаблона и изменить его свойства?

Что-то вроде:

Band nirvana = Band.builder(rollingStones).name("Nirvana");

Я не могу найти это в документации ломбока.

Ответ 1

Вы можете использовать параметр toBuilder чтобы предоставить вашим экземплярам метод toBuilder().

@Builder(toBuilder=true)
class Foo {
   int x;
   ...
}

Foo f0 = Foo.builder().build();
Foo f1 = f0.toBuilder().x(42).build();

Из документации:

Если вы используете @Builder для создания сборщиков для создания экземпляров вашего собственного класса (это всегда так, если не добавлять @Builder к методу, который не возвращает ваш собственный тип), вы можете использовать @Builder (toBuilder = true), чтобы также генерировать метод экземпляра в вашем классе, называемый toBuilder(); он создает новый строитель, который начинается со всех значений этого экземпляра.

Отказ от ответственности: я разработчик ломбок.

Ответ 2

Есть простой способ создать объект Foo, используя существующий объект в качестве шаблона и изменить одно из его свойств? (акцент мой)

Если вы действительно хотите изменить одно свойство, то лучше и эффективнее:

@Wither
class Band {
   String name;
   String type;
}

Band nirvana = rollingStones.withName("Nirvana");

Увядание не создает мусора, но может изменить только одно поле. Для изменения многих полей вы можете использовать

withA(a).withB(b).withC(c)....

и производят тонны мусора (все промежуточные результаты), но чем toBuilder более эффективен и более естественен.