🍱 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