Шаблон строителя направлен на предоставление гибкого решения для построения сложных структур данных путем отделения процесса сборки от окончательного представления структуры данных. Мы используем шаблон строителя для получения изменяемой промежуточной переменной и неизменяемого конечного результата.
Поскольку типы записей Java по умолчанию являются неизменяемыми, шаблон конструктора отлично подходит для записей.
1. Использование вложенного конструктора
Следующая запись User содержит вложенный объект Builder, который принимает два обязательных аргумента: id и name. Два других поля используют Fluent API для установки данных. Наконец, метод build() возвращает полностью построенный экземпляр записи.
public record User(long id, String name, String email, boolean status) {//Builderpublic static final class Builder {long id;String name;String email;boolean status;public Builder(long id, String name) {this.id = id;this.name = name;}public Builder email(String email) {this.email = email;return this;}public Builder status(boolean status) {this.status = status;return this;}public User build() {return new User(id, name, email, status);}}}
Мы можем использовать класс Builder следующим образом:
User user = new Builder(1L, "Lokesh").email("abc@domain.com").status(true).build();
Обратите внимание, что запись по-прежнему можно использовать без конструктора, но конструктор предоставляет дополнительный и гибкий способ создания экземпляра записи.
2. Использование Lombok @Builder
Lombok — полезная библиотека для минимизации шаблонного кода для таких функций, как реализация шаблона строителя в классе или записи. Начните с включения последней версии Lombok в проект. Вы можете следовать этому подробному руководству по установке Lombok.
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope></dependency>
Используйте аннотацию @lombok.Builder с записью пользователя, чтобы добавить поддержку Fluent API.
import lombok.Builder;@Builderrecord User(long id, String name, String email, boolean status) { }
Мы можем создать экземпляр User шаг за шагом следующим образом:
User user = User.builder().id(1l).name("Lokesh").email("email@domain.com").status(true).build();
3. Использование RecordBuilder
RecordBuilder — это библиотека с открытым исходным кодом для добавления новых функций к типам записей, таких как:
- класс строителя
- конструкторы копирования
3.1.Мавен
Начните с добавления зависимости RecordBuilder в проект.
<dependency><groupId>io.soabase.record-builder</groupId><artifactId>record-builder-core</artifactId><version>34</version></dependency>
Также включите обработку аннотаций, добавив record-builder-processor в путь процессора аннотаций.
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><annotationProcessorPaths><path><groupId>io.soabase.record-builder</groupId><artifactId>record-builder-processor</artifactId><version>34</version></path></annotationProcessorPaths></configuration></plugin>
3.2. Аннотация @RecordBuilder
Аннотация включает API Fluent Builder в аннотированном типе записи.
@RecordBuilderrecord User(long id, String name, String email, boolean status) { }
Эта аннотация генерирует новый класс с именем записи, к которому добавлено «Builder». Например, для записи User сгенерированный класс builder — UserBuilder.
User user = UserBuilder.builder().id(1l).name("Lokesh").email("email@domain.com").status(true).build();
Мы можем использовать конструктор как конструктор копирования для создания новой записи из существующей записи, изменив только 1 или 2 поля. Он копирует поля существующего пользователя в нового пользователя и изменяет только требуемые поля.
User newUser = UserBuilder.builder(user).email("new-email@domain.com").status(true).build();
Библиотека также позволяет использовать методы «with» для единичного изменения любой записи.
User inactiveUser = UserBuilder.from(user).withStatus(false);
4. Заключение
В этом уроке по Java мы научились реализовывать API Fluent в стиле шаблона конструктора для создания записей пошаговым способом. Мы также научились использовать библиотеку RecordBuilder для реализации конструкторов копирования в записях.