Долой boilerplate! Генерация геттеров и сеттеров и с Lombok.

Плагин Lombok — настоящая находка для тех, кто надоел писать (хотя зачем писать, если любая среда генерирует их нажатием пары клавиш) одинаковые get и set методы. Либо просто считает, что такое количество кода, который не делает ничего особенного просто засоряет ваши классы. Давайте рассмотрим простой класс модели Contact, представляющий пользовательский контакт:

Класс мог бы содержать и больше полей, но даже здесь на лицо большое количество явного boilerplate-кода, который выполняет простейшие действия. К сожалению, в Java на уровне языка нет возможности указать, что класс должен содержать методы получения и установки более лаконичным способом, как, например, в том же Kotlin.

Использование Lombok.

Lombok — это плагин к IntelijIdea, который использует аннотации и кодогенерацию того самого однообразного кода, как геттеры/сеттеры/конструкторы с полным набором аргументов и так далее за нас. Работает все на этапе компиляции, поэтому никаких потерь производительности вы не получаете.

Чтобы начать использовать Lombok в своих проектах уже сейчас, выполните следующие шаги:

  1. Установите плагин для Intelij Idea. Это можно сделать Это можно сделать в меню Settings -> Plugins. В поиске просто вбейте название плагина и нажмите кнопку Install.
  2. Теперь включите в Intelij Idea возможность обработки аннотаций. Зайдите в меню Settings -> Build, Execution, Deployment -> Compilier:                                                                              И включите annotation processing, установив соответствующую галочку.
  3. Добавьте зависимость в файл pom.xml, если используете для сборки своих проектов Maven:

    Или следующую строку, если используете Gradle:
  4. Нажмите Build -> Rebuild project.

Lombok на практике.

Давайте теперь посмотрим как выглядел бы тот же класс с применением Lombok и набором его фирменных аннотаций:

Код стало проще читать? Код стал чище?

Вы в свое распоряжение получаете довольно внушительный список аннотаций, почитать подробнее о них вы можете здесь. А мы рассмотрим здесь лишь некоторые из них.

У сгенерированных методов можно задавать уровень доступа — например, метод должен быть приватным или защищенным. Допустим, что геттер и сеттер для поля id нужно сделать приватными:

Аннотации @ToString и @EqualsAndHashCode.

Аннотации с говорящими названиями, которые вы можете использовать для указания того, чтобы Lombok сгенерировал для вас эти методы. Давайте сначала взглянем на аннотацию @ToString и на вывод при вызове этого метода у класса Contact.

Файл Contact.java:

Здесь мы видим минимальные отличия по сравнению с кодом, приведенным выше. В аннотации @ToString мы указываем один параметр для вывода названия всех полей вместе с их значениями. Теперь давайте протестируем наш класс:

В этом коде я создаю новый контакт, устанавливаю значения полей и вывожу на экран. В итоге получается следующий вывод:

Теперь взглянем на использование аннотации @EqualsAndHashCode:

В параметре exclude мы перечисляем те поля, которые должны быть исключены при расчете хеш-кода и при сравнении. Как видим, и при использовании этой аннотации нет ничего сложного.

Конструкторы — @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor.

Для генерации специальных методов-конструкторов у Lombok также имеется свой набор аннотаций:

  • @NoArgsConstructor — генерация пустого конструктора без аргументов.
  • @RequiredArgsConstructor — генерируется конструктор, включающий в себя поля, которые обязательно должны быть инициализированы при построении объекта. Это поля, помеченные модификатором final или аннотацией @NonNull.
  • @AllArgsConstructor — сгенерированный конструктор будет принимать в качестве параметра все поля класса.

А теперь взглянем, как это будет выглядеть на примере с @RequiredArgsConstructor:

Итак, мы добавили к классу аннотацию @RequiredArgsConstructor и пометили два поля — firstName и lastName аннотацией @NonNull. Следовательно, Lombok должен сгенерировать нам конструктор, принимающий только эти два обязательных(required) параметра. В аннотации @ToString, описанной ранее мы временно исключаем из вывода те поля, которые нас сейчас не интересуют.

Если вы попробуете сейчас создать объект, используя пустой конструктор, то компилятор сообщит вам об ошибке и о том, что конструктор должен принимать на вход два параметра типа String. Удовлетворим его требованиям:

Выведем результат на экран:

Также, добавив в данный аннотациям параметр staticName мы можем вместо обычного конструктора получить статический фабричный метод с указанным именем, например:

Тогда в коде создание объекта будет выглядеть следующим образом:

Отлично! И тут Lombok со всем справился.

@Data — собираем все вместе.

Ну и последняя аннотация, которую мы сегодня разберем. Сообщает Lombok о том, что нужно сгенерировать весь обычно требующийся boilerplate-код и соответствует одновременному использованию в классе аннотаций @Getter/@Setter, @ToString, @EqualsAndHashCode и рассмотренной только что @RequiredArgsConstructor. Если это все то, что вам нужно, то достаточно использовать только ее:

На самом деле аннотация @Data, на мой взгляд, отличное дополнение, которое позволяет не слишком загромождать код аннотациями, но получать при этом нужно поведение.

Также никто не мешает вам настраивать более тонкое поведение, например, использовать статический конструктор и сделать некоторые методы доступа приватными:

Теперь мы получим все тоже самое, но методы установки для поля id станут исключительно приватными.

Итоги.

Lombok — это полезный инструмент для снижения в ваших проектах количества шаблонного кода с применением богатого, но при этом простого в использовании набора аннотаций. Плагин Lombok имеет смысл использовать в средних и больших проектах. Как недостаток — иногда большое количество аннотаций от разных фреймворков вроде валидаторов компонентов или json-парсеров могут очень сильно загромождать код.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *