제이온

[Эффективный Java] Элемент 2. Если конструктор имеет много параметров, рассмотрите возможность использования билдера

  • Язык написания: Корейский
  • Страна: Все страныcountry-flag
  • ИТ

Создано: 2024-04-27

Создано: 2024-04-27 00:46

Паттерн постепенного создания конструктора

Как статические фабричные методы, так и конструкторы плохо справляются с большим количеством параметров. Например, если у класса 6 полей, и мы хотим создать конструкторы для 2, 3 и т.д. параметров, то мы можем использовать паттерн постепенного создания конструктора, как показано ниже.



Однако даже этот подход становится сложным при большом количестве параметров. При чтении кода становится сложно понять, что означает каждый параметр, а также есть риск перепутать параметры одного типа и передать неверные значения.


Паттерн JavaBeans

Паттерн JavaBeans создает объект с помощью конструктора без параметров, а затем устанавливает значения параметров с помощью методов-setter.



Паттерн JavaBeans позволяет избежать путаницы при передаче большого количества параметров. Однако для создания объекта требуется вызов нескольких методов-setter, и до завершения процесса создания объекта может нарушаться его целостность. Из-за этого класс не может быть неизменным.


Паттерн Строитель

Чаще всего используется паттерн Строитель, который сочетает в себе надежность паттерна постепенного создания конструктора и удобочитаемость паттерна JavaBeans.

Вместо непосредственного создания объекта клиент вызывает конструктор с обязательными параметрами для получения объекта-строителя. Затем, используя методы-setter, которые предоставляет объект-строитель, клиент устанавливает желаемые значения необязательных параметров. Наконец, вызов метода build() без параметров возвращает необходимый объект.



Конструктор класса Builder принимает только обязательные параметры, а остальные необязательные параметры устанавливаются с помощью методов-setter. И, наконец, метод build() создает завершенный объект NutritionFactsWithBuilderPattern. Класс NutritionFactsWithBuilderPattern неизменяемый, а методы-setter класса Builder возвращают сам Builder, поэтому их можно вызывать в цепочке. Такой подход называется плавным API или связыванием методов.



С точки зрения клиента, паттерн Строитель позволяет писать и читать код проще.


Паттерн Строитель хорошо сочетается с иерархически структурированными классами


Класс Pizza.Builder — это обобщенный тип с рекурсивным ограничением типа, который использует абстрактный метод self() для поддержки связывания методов без приведения типов в дочерних классах. В дочерних классах этот абстрактный метод должен возвращать сам себя.

Теперь рассмотрим дочерние классы Pizza — нью-йоркскую пиццу и кальцоне, чтобы продемонстрировать гибкость паттерна Строитель.



Метод build() в каждом дочернем классе строителя возвращает конкретный дочерний класс. Способность метода в дочернем классе возвращать тип, являющийся подтипом типа, возвращаемого методом в базовом классе, называется ковариантным типом возвращаемого значения. Благодаря этой функции клиенту не нужно выполнять приведение типов.



Клиент может использовать перечисления Pizza и каждого дочернего класса, а также соответствующие методы для создания объектов.


Недостатки паттерна Строитель

  • Необходимо создавать объект-строитель.
  • Код может быть громоздким.


Заключение

Если конструктор или статический фабричный метод должен обрабатывать большое количество параметров, стоит рассмотреть паттерн Строитель.


Источники

  • Эффективная Java

Комментарии0

DI на уровне фреймворка: под силу даже начинающим разработчикам Node.jsСтатья описывает реализацию внедрения зависимостей (DI) в разработке серверов Node.js. Рассматриваются способы реализации DI с использованием функции метаданных Reflect компилятора TypeScript, а также соответствующие библиотеки.
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

November 8, 2024

[1 день] Веселое создание игры с помощью ИИПредставляем дневник разработки 100-этажной подземельной игры, создаваемой с помощью ИИ на Javascript, HTML и CSS. В настоящее время реализуются система города, подземелий и сражений; на данный момент завершены создание события генерации персонажа и функ
꼬반
꼬반
꼬반
꼬반

November 8, 2024

29.11.2024 Поздние новости: платная подписка на Replit / Хорошие привычки в разработке ПОВ записи блога от 29 ноября 2024 года мы делимся опытом использования платной подписки на Replit и представляем 10 хороших привычек в разработке программного обеспечения. Обсуждаются стратегии эффективного кодирования и рефакторинга, а также важность тес
Charles Lee
Charles Lee
Charles Lee
Charles Lee

November 29, 2024

Ковариантность и контравариантностьВ этой статье объясняются понятия ковариантности и контравариантности. На примере Animal и Dog объясняется ковариантность и контравариантность, подчеркивается необходимость контравариантности для обеспечения гибкости, например, в обработке событий. Также
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

November 1, 2024

[Часть 5] Создание веб-игры за 30 минут с помощью ИИ. — Финал —Это заключительная часть создания веб-игры за 30 минут с помощью ИИ. По мере добавления функций и удлинения кода возникли проблемы с качеством, появились ошибки, и отладка стала затруднительной. Мы поняли важность проектирования структуры с самого начал
꼬반
꼬반
꼬반
꼬반

November 8, 2024