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

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы скопировать объект и изменить его свойства при помощи Lombok, используйте аннотацию @Builder(toBuilder = true), которая активизирует метод toBuilder():

Java
Скопировать код
@Builder(toBuilder = true)
public class Example {
    private String data;
    // Допустим, у нас есть также и другие поля
}

Example original = new Example("original");
Example clone = original.toBuilder().build();

Запомните:

  • В вашем классе активизируйте @Builder(toBuilder = true);
  • Для клонирования примените original.toBuilder();
  • Создание объекта завершите с помощью метода .build().
Кинга Идем в IT: пошаговый план для смены профессии

Когда стоит использовать toBuilder

toBuilder идеально подойдёт, когда важно сохранить неизменность или когда требуется создать новый экземпляр с целью изменить несколько свойств. Это гораздо удобнее, чем переприсваивать все поля вручную.

Эффективный @With для быстрых изменений

Если вам нужно внести изменения всего в одно или два поля, попробуйте @With. Он обеспечивает класс методами with для каждого поля, позволяя создать новый экземпляр без использования строителя:

Java
Скопировать код
@Data
@With
public class Example {
    private final String data;
    private final int count;
    // И т.д....
}

Example example = new Example("data", 42);
Example modified = example.withData("newData");
// Метод с @With, позволяющий изменить данные

Посмотрите на альтернативы toBuilder

В дополнение к Lombok существуют и другие инструменты, например, ObjectMapper из Jackson для осуществления клонирования:

Java
Скопировать код
ObjectMapper mapper = new ObjectMapper();
Example source = new Example("source");
Example cloned = mapper.convertValue(source, Example.class);
// В результате получим практически идентичный клон

Учтите: для работы ObjectMapper требуется правильная настройка для игнорирования null и свойственных ему преобразований свойств.

Давайте обсудим вопрос производительности

@With более лёгок в использовании и подходит, когда требуется изменить лишь одно свойство. Но если предстоит внести много изменений, то лучше выбрать toBuilder().

Визуализация

Воспринимайте Lombok как игру в конструктор Lego. Вам предстоит построить что-то новое:

Markdown
Скопировать код
Исходный объект (🏠): [🚪 Дверь, 🪟 Окно, 🛁 Ванна]

После применения @Builder(toBuilder = true):

Java
Скопировать код
Новый объект (🏡): originalObject.toBuilder()
                                  .window(newWindow) // И вот у вас новое окно 🪟
                                  .build();

🏠 превратился в 🏡: [🚪 Дверь, 🆕🪟 Новое Окно, 🛁 Ванна]. Теперь у вас есть обновлённая конструкция с помощью удобного toBuilder от Lombok.

Цирк сложных объектов

В "джунглях" сложных объектов глубокое копирование может стать спасительным. В таких ситуациях toBuilder является всего лишь скромным инструментом, и стоит задуматься о глубоком клонировании для создания идеальных дубликатов.

Обработка наследования при помощи @SuperBuilder

Когда дело касается наследования, @SuperBuilder отлично справляется с задачей, выигрывая у toBuilder. Он помогает клонировать объекты с учётом иерархии классов, обеспечивая типизацию и соответствие стандарту строителя.

Шпаргалка по клонированию

  • Используйте toBuilder для массовых изменений и @With для единичных.
  • Не создавайте излишнее количество экземпляров, чтобы снизить потребление памяти.
  • Неизменяемые объекты изначально предусматривают возможность клонирования через их конструкторы.
  • И помните: инкапсулируйте объект, чтобы предотвратить несанкционированные изменения.

Полезные материалы

  1. Stable – Всё, что вам нужно знать о Project Lombok.
  2. Понимание Builder и toBuilder в LombokДетальное руководство по использованию @Builder и toBuilder.
  3. Medium – Экспертные советы из Effective Java, Пункт 6: избегайте создания лишних объектов.
  4. Копирование свойств из одного объекта в другой с помощью BeanUtils – Мастерство работы со свойствами при помощи BeanUtils.
  5. Глубокое копирование в Java для создания объекта из другого – Разбор процесса реализации глубокого копирования.
  6. Oracle JavaDocs: Интерфейс Cloneable – Пояснения от Oracle по интерфейсу Cloneable.