Получить доступ

Почему паттерн Builder особенно удобен при создании неизменяемых объектов?

MiddleПаттерны проектирования
Коротко

У неизменяемого объекта без билдера два плохих варианта: сеттеры (и он уже изменяем) или конструктор с длинным списком однотипных аргументов. Builder собирает состояние по именованным шагам, проверяет все инварианты в build() и отдаёт готовый неизменяемый объект.

  • Нет «полусобранного» объекта, видимого другим
  • Необязательные параметры без телескопических конструкторов
  • JDK: HttpRequest.newBuilder(), StringBuilder (неизменяемый String в конце)

А ещё Lombok @Builder; для record — компактный конструктор и withers

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Без билдера у неизменяемого объекта остаются два плохих варианта: сеттеры (и тогда он уже не immutable) или конструктор с восемью аргументами одного типа. Билдер Блоха решает обе проблемы: именованные шаги вместо позиционных аргументов и проверка всех инвариантов разом в build(). Примеры в JDK: HttpRequest.newBuilder() из Java 11, Stream.builder(), Locale.Builder.

Что хотят услышать

  • Проблема конструкторов и сеттеров.
  • Валидация в build.

Частые ошибки

  • Считать StringBuilder примером этого паттерна — это изменяемый буфер, совпало только название.
  • Путать Builder Блоха (борьба с телескопическими конструкторами) с Builder GoF (Director и разные представления).

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Состояние собирается по частям, а на выходе отдаётся полностью готовый объект, все инварианты которого проверены в build()
  • ✗Билдер добавляет объекту сеттеры, не нарушая неизменяемость
  • ✗Билдер делает объект потокобезопасным при публикации
  • ✗Билдер позволяет менять поля объекта после создания

Что спросят дальше

  • Чем Builder GoF отличается от Builder Блоха?
  • Что делает Lombok @Builder?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем