Lombok @Builder не создает неизменных объектов? - PullRequest
1 голос
/ 11 апреля 2020

На многих сайтах я видел, что lombok @Builder может использоваться здесь для создания неизменяемых объектов (https://www.baeldung.com/lombok-builder-singular), а также на многих сайтах говорят, что шаблон Builder в основном используется для создания неизменяемых объектов.

TimeIntervalData td = TimeIntervalData.builder().endTime("12:00").startTime("10:00").build();
td.setEndTime("14:00");
System.out.println(td.getEndTime());

Я не уверен, как я могу использовать сеттеры на объектах, построенных с использованием компоновщиков. Я что-то упускаю здесь?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

в основном используется для создания неизменяемых объектов

Это утверждение неверно. Основная цель - уменьшить код котельной плиты. Создание объекта с использованием компоновщика является компактным, его легче писать и легче читать.

Когда у вас есть 1-2 атрибута, компоновщик может быть неудобен и может сделать код менее читаемым по сравнению с передачей параметров через конструктор .

Поэтому, когда использовать или не использовать конструктор, это дело вкуса.

Для установщиков: если вам нужны сеттеры, вы можете сгенерировать их с помощью аннотации @ Data .

0 голосов
/ 11 апреля 2020

Да, lombok builder не будет создавать неизменяемые экземпляры, если пользователь определяет параметры в классе как final, в соответствии с документами из lombok.builder @Builder позволяет автоматически создавать код, необходимый для класс может быть создан с помощью кода, такого как:

Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();

В соответствии с документами он просто создает внутренний класс stati c с теми же свойствами, что и внешний класс

Метод, аннотированный @Builder (отныне называемый целью), генерирует следующие 7 вещей:

  • Внутренний класс stati c с именем FooBuilder, с тем же введите аргументы в качестве метода stati c (называемого компоновщиком).
  • В компоновщике: по одному частному non-stati c неконечному полю для каждого параметра цели.
  • В компоновщике: закрытый конструктор пакета без аргументов.
  • В компоновщике: метод, подобный сеттеру, для каждого параметра цели: он имеет тот же тип, что и этот параметр это и то же имя. Он возвращает самого построителя, так что вызовы установщика могут быть связаны
  • В построителе: метод build (), который вызывает метод, передавая каждое поле. Он возвращает тот же тип, что и цель:
  • В конструкторе: разумная реализация toString ().
  • В классе, содержащем цель: метод builder (), который создает новый экземпляр построителя.

Но использование @ Singular с аннотацией @Builder для свойств коллекции делает их одноэлементными

Путем аннотирования одного из параметров ( если аннотировать метод или конструктор с помощью @Builder) или поля (если аннотировать класс с помощью @Builder) аннотацией @Singular, lombok будет обрабатывать этот узел-конструктор как коллекцию и генерирует 2 метода «сумматора» вместо «сеттера» метод. Один, который добавляет один элемент в коллекцию, и один, который добавляет все элементы другой коллекции в коллекцию. Никакой установщик, который просто устанавливает коллекцию (заменяя все, что уже было добавлено), не будет создан.

@ Singular можно применять только к типам коллекций, известным lombok.

...