Допустим, у меня есть аннотированный класс ломбока, например
@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");
Я не могу найти это в документации по ломбоку.
@Wither
, что является более эффективным для изменения отдельных полей:Foo f1 = f0.withX(42)
.@Wither
генерируется с помощью * методов, которые всегда возвращают новый объект, вместо того, чтобы устанавливать поле существующего объекта. Это низкая эффективность.@Wither
Лучше всего для изменения одного поля . Если больше двух,toBuilder
победа. Смотрите мой ответ ниже.@Wither
вообще не будет работать, но.toBuilder().build()
будет.Если вы действительно хотите изменить одно свойство, есть более приятный и эффективный способ:
@With class Band { String name; String type; } Band nirvana = rollingStones.withName("Nirvana");
Холка не создает мусора, но может изменить только одно поле. Для изменения многих полей вы можете использовать
и производить тонны мусора (все промежуточные результаты), но чем
toBuilder
эффективнее и естественнее.ПРИМЕЧАНИЕ. В более старых версиях ломбока использовались
@Wither
аннотации. См. Начало документации .источник
n-1
объекты для серииn
обращенийwithSomething
. Объект стоит примерно несколько байтов плюс 4 или 8 байтов на ссылку плюс от 1 до 8 байтов на примитив. Итак, мы говорим о десятках байтов на вызов. Обычно ничего страшного.