Почему паттерн Builder особенно удобен при создании неизменяемых объектов?
У неизменяемого объекта без билдера два плохих варианта: сеттеры (и он уже изменяем) или конструктор с длинным списком однотипных аргументов. Builder собирает состояние по именованным шагам, проверяет все инварианты в build() и отдаёт готовый неизменяемый объект.
- Нет «полусобранного» объекта, видимого другим
- Необязательные параметры без телескопических конструкторов
- JDK: HttpRequest.newBuilder(), StringBuilder (неизменяемый String в конце)
А ещё Lombok @Builder; для record — компактный конструктор и withers
Подробно
Без билдера у неизменяемого объекта остаются два плохих варианта: сеттеры (и тогда он уже не immutable) или конструктор с восемью аргументами одного типа. Билдер Блоха решает обе проблемы: именованные шаги вместо позиционных аргументов и проверка всех инвариантов разом в build(). Примеры в JDK: HttpRequest.newBuilder() из Java 11, Stream.builder(), Locale.Builder.
Что хотят услышать
- Проблема конструкторов и сеттеров.
- Валидация в build.
Частые ошибки
- Считать StringBuilder примером этого паттерна — это изменяемый буфер, совпало только название.
- Путать Builder Блоха (борьба с телескопическими конструкторами) с Builder GoF (Director и разные представления).
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Билдер делает объект потокобезопасным при публикации
- ✗Билдер позволяет менять поля объекта после создания
- ✓Объект собирается по частям и отдаётся готовым, с проверкой в build()
- ✗Билдер добавляет объекту сеттеры, но не нарушает его неизменяемость снаружи
Что спросят дальше
- Чем Builder GoF отличается от Builder Блоха?
- Что делает Lombok @Builder?
Разбор темы
- Порождающие паттерны
Factory Method против статической фабрики Блоха, Abstract Factory, Builder в двух версиях, Prototype и почему clone() считают ошибкой, object pool — с примерами из JDK и Spring.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.