Uploaded by Богдан Мазуренко

Lombok (1)

advertisement
🍱
Lombok
Зачем нужен Lombok
Добавляем плагин Lombok в IntelliJ IDEA
Использование Lombok
Аннотации
@Getter
и
Аннотация
@ToString
Аннотация
@EqualsAndHashCode
Аннотации
@NoArgsConstructor
Аннотация
@Data
Аннотация
@NonNull
@Setter
,
@AllArgsConstructor
и
@RequiredArgsConstructor
Паттерны проектирования
Паттерн билдер и аннотация
Аннотация
@Builder
@Value
Аннотация для логирования
Зачем нужен Lombok
Чтобы не тратить время на написание шаблонного кода, разработчик может
использовать библиотеку Lombok. Она подключается к проекту и позволяет
автоматически генерировать геттеры, сеттеры, конструкторы, методы toString() ,
Lombok
1
equals(Object)
и
hashCode()
, а также автоматизировать создание переменных для
логирования с помощью аннотаций и многое другое.
Аннотации, предоставляемые Lombok, описывают функциональность, которую
нужно добавить в код класса. Библиотека также предоставляет обработчики этих
аннотаций, которые генерируют необходимый код в процессе компиляции.
Например, если поле класса аннотировать как @Getter , то во время компиляции
Lombok добавит в класс метод для чтения значения этого поля. При работе с
исходным кодом программист будет видеть только важную его часть и может не
отвлекаться на шаблонные места.
Добавляем плагин Lombok в IntelliJ IDEA
Чтобы использование генерируемых библиотекой методов не считалось ошибкой с
точки зрения среды разработки, необходимо добавить в IntelliJ IDEA плагин
Lombok.
В новых версиях IntelliJ IDEA плагин уже установлен.
Lombok
2
Если плагина Lombok нет среди установленных, перейдите на вкладку
Marketplace. Найдите плагин и установите его. Обратите внимание, что после
завершения установки необходимо перезагрузить IntelliJ IDEA.
Теперь нужно подключить библиотеку к системе сборки. Для этого добавьте в
любое место блока
зависимость.
<dependencies>
файла
pom.xml
Maven-проекта следующую
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
В этой структуре есть дополнительный параметр <scope>provided</scope> . Тег
provided указывает, что данная библиотека необходима только на этапе
компиляции проекта. В собранном JAR она не будет использоваться, так как уже
сгенерировала всё необходимое и больше не понадобится. Не забудьте
синхронизировать изменения, сделанные в файле pom.xml . Актуальную
информацию по подключению вы можете найти в официальной инструкции по
установке для Maven.
Использование Lombok
По сути работа с Lombok сводится к работе с предоставляемыми ей аннотациями.
Схема взаимодействия с библиотекой такова:
@lombok.Getter
class Cat {
}
Аннотации
@Getter
и
@Setter
Автоматически добавит геттеры и сеттеры для переменных во время компиляции.
Аннотация
Lombok
@ToString
3
Генерирует реализацию для метода toString() . В данный метод по умолчанию
будут добавлены следующие представления объекта: имя класса, названия всех
полей и их значения.
Аннотация
Генерует
@EqualsAndHashCode
equals(Object)
и
hashCode()
Аннотации
@NoArgsConstructor
@RequiredArgsConstructor
,
@AllArgsConstructor
и
Для создания различных типов конструкторов существует три аннотации.
@NoArgsConstructor
генерирует конструктор без параметров;
public Point() {
}
@AllArgsConstructor
генерирует конструктор, включающий все возможные поля;
public Point(final int x, final int y) {
this.x = x;
this.y = y;
}
генерирует конструктор, включающий все final -поля
или поля, помеченные аннотацией @NonNull , — об этой аннотации мы
@RequiredArgsConstructor
расскажем далее.
Если к полю
добавить модификатор final , то после применения
@RequiredArgsConstructor будет сгенерирован следующий конструктор.
x
public Point(final int x) {
this.x = x;
}
Lombok
4
💡
Если в классе есть нестатические
final
-поля, возможна комбинация
только двух аннотаций: @RequiredArgsConstructor и @AllArgsConstructor .
Конструктор без аргументов сгенерирован не будет, потому что final поля должны быть обязательно проинициализированы. Использование
аннотации @NoArgsConstructor в таком классе возможно только с флагом
force=true
Аннотация
, который установит для этих полей значения по умолчанию.
@Data
Часто необходимо пометить один класс сразу пятью аннотациями:
@Setter
,
@ToString
,
@EqualsAndHashCode
и
@RequiredArgsConstructor
@Getter
,
. Вот пример такого
кода.
В подобных случаях можно воспользоваться одной аннотацией
@Data
. Она
позволяет генерировать геттеры, сеттеры, методы toString() , equals() и hashCode()
и конструкторы со всеми final -полями, а значит, объединяет в себе возможности
сразу пяти аннотаций.
Аннотация
@NonNull
С помощью Lombok можно проверить, что поле не принимает значение null .
Чтобы сделать это, достаточно пометить нужные поля аннотацией @NonNull , и
библиотека сгенерирует для них проверку на неинициализированное значение.
Поведение кода с аннотацией @NonNull будет точно таким же, как если бы в него
была вручную добавлена генерация исключения
throw .
NullPointerException
с помощью
Паттерны проектирования
Существует 22 классических паттерна проектирования, каждый из которых
подсказывает оптимальное решение определённой проблемы. Паттерны делятся
на три группы:
порождающие применяются для гибкого создания объектов без внесения в
код лишних зависимостей;
структурные показывают различные способы построения связей между
объектами;
Lombok
5
поведенческие описывают эффективную коммуникацию между объектами.
Не стоит путать паттерн с алгоритмом. Алгоритм — чёткая последовательность
действий для получения конкретного результата. Паттерн — высокоуровневое
описание решения задачи, которое может отличаться в двух разных программах.
Паттерн билдер и аннотация
@Builder
Билдер — порождающий паттерн проектирования, который применяется для
удобного построения сложного объекта. Этот паттерн используется, например, при
работе с классом StringBuilder , когда с помощью последовательного вызова его
методов
append()
с различными типами данных создаётся новая строка.
Применение билдера имеет следующие преимущества:
можно создавать объекты поэтапно;
можно использовать один и тот же код для создания различных типов
объектов;
код сборки объекта изолируется от основной логики программы.
💡
Если при создании объекта требуется присвоить переменным значение
по умолчанию, используется аннотация @Builder с дополнительной
пометкой
Аннотация
.Default
.
@Value
Изменяемые объекты — это те, которые могут быть изменены в процессе
выполнения программы, в том числе разными её частями одновременно. В
программах, которые могут запускать несколько действий одновременно, лучше
использовать неизменяемые (англ. immutable) объекты, то есть те, состояние
которых не может быть изменено после их создания. Все поля этих объектов
объявлены финальными, и их значения не могут быть переназначены.
Аннотация @Data создаёт полностью изменяемый (англ. mutable) объект. Для
создания неизменяемого объекта в Lombok есть аннотация @Value . Она похожа на
@Data
, но:
не генерирует сеттеры;
Lombok
6
генерирует
final
-и
private
-поля для объекта;
использует конструктор, куда передаются все поля (то есть возможности
аннотации
@AllArgsConstructor
).
Разработчику может понадобиться изменить значение какого-либо поля объекта.
Если это изменяемый объект, достаточно вызвать сеттер с нужным значением и
установить его. В случае с неизменяемыми объектами для каждого такого
изменения потребуется новый объект. Строить объект заново неудобно. Зато
можно скопировать уже существующий. Для этого необходимо добавить
преобразование готового неизменяемого объекта в билдер с помощью
дополнительного флага в аннотации:
будет выглядеть так.
@Builder(toBuilder = true)
. Код копирования
final Point point1 = Point.builder().x(0).y(0).build();
System.out.println(point1);
final Point point2 = point1.toBuilder().y(3).build();
System.out.println(point2);
Метод
toBuilder()
вернёт билдер с уже проинициализированными на основе
исходного объекта полями. После этого в них можно поменять какое-либо
значение и сконструировать нужный объект.
Аннотация для логирования
В Lombok есть набор аннотаций, упрощающих инициализацию переменных для
логирования. Их список можно найти на странице библиотеки. Каждая из них
отвечает за тот или иной фреймворк.
Lombok
7
Download