java что такое lombok
Другие острова. Проект Ломбок для Java
Это статья является этаким вольным переводом-пересказом.
Оказывается, Ява — это не единственный остров, который как-то связан с разработками на Java. Вот вам ещё один, который называется «Ломбок». Именем этого острова назван замечательный проект, распространяемый по лицензии MIT.
Что такое Project Lombok?
Установка Lombok и поддержка Maven
Lombok предоставляется в виде исполняемого файла JAR (lombok.jar). Правда, в настоящее время режим среды разработки работает только в Eclipse. При запуске файла JAR, появится простой мастер и попросит указать, где находятся исполняемые файлы Eclipse (см. Рисунок 1).
Рисунок 1. Мастер установки Lombok.
Просто укажите на исполняемые файлы Eclipse и нажмите «Install/Update». Вы должны будете делать это каждый раз для всех новых версий Lombok.
Чтобы включить поддержку Maven, просто добавьте репозиторий Lombok и его зависимости в файл pom.xml, следуя инструкциям на веб-сайте проекта. После чего, Lombok будет работать с жизненным циклом компиляции Maven «прямо из коробки».
Project Lombok в действии
Для полного понимания, каким образом Lombok истребляет массу строк кода в типичном классе POJO, рассмотрим следующую типичную сущность Person:
Для того чтобы этот класс стал настоящим правильным POJO, необходимо дописать для него код getters, setters, toString(), equals() и hashCode(). Если бы вы решили использовать в Eclipse функции автоматической генерации кода, то Person POJO со скоростью грибов разрастётся до более чем 240 строк кода, большинство из которых, хоть и необходимый, но фактически просто мусор, затрудняющий чтение и понимание. (см. Листинг 1).
Листинг 1. Сгенерированный автоматически Person POJO
А теперь, как выглядит тот же POJO после «Ломбокизации»:
И всё! Когда Lombok установлен в вашей Eclipse Runtime, то простая аннотация Data рисует волшебным образом весь тот код необходимого стандартного мусора. Что делает определение сущностей JPA/Hibernate невероятно легким и быстрым.
Но и это ещё не всё! Все методы getters и setters появятся в схеме, как если бы код существовал на самом деле (см. Рисунок 2).
Рисунок 2. Все методы getters и setters видны в схеме
А также их видно и при дополнении кода (см. Рисунок 3).
Рисунок 3. Все методы видны при дополнении кода
Если необходим более филигранный контроль, то Project Lombok предлагает следующие аннотации Getter, @Setter, @ToString и @EqualsAndHashCode. А вышесказанное означает, что аннотация Data комбинируя, заключает их все в себе. В нашем процессе разработки, аннотация Data используется в 99% случаях.
Дополнительные особенности Lombok
И нет необходимости ждать Java 7, чтобы использовать автоматическое управление ресурсами уже сегодня в Java 6.
Решите вы или нет использовать эту функцию (у меня смешанные чувства по поводу нее), но такую возможность иметь полезно.
Планы на будущее: Добавление новых особенностей Java
На момент написания, актуальной версией Проекта Ломбок была 0.8.5. Краткосрочной перспективой команды Ломбок была стабилизация и безотказность работы в Eclipse. Хотя, имеются некоторые незначительные проблемы ранних версий (например, некоторые неожиданные предупреждения при компиляции), но простая перекомпиляция проекта позволяет быстро от них избавиться. В целом, выгода от использования Ломбок намного перевешивает имеющиеся небольшие сбои Eclipse (и которые довольно редки, по моему опыту). Долгосрочные же планы у Ломбок гораздо более грандиозные. Оба автора проекта Ломбок (Reinier Zwitserloot и Roel Spilker) хотят перехватить процесс компиляции в Eclipse до точки, где они действительно могут добавить новые функции в Java, в частности, реальное завершение. Узнайте больше об этой амбициозной цели в этом обсуждаении Google Groups.
Недостатки
Основной недостаток Ломбок очевиден: работа в режиме среды разработки поддерживается только в Eclipse. Если Eclipse не является вашей IDE, то на данный момент проект Ломбок это не ваш вариант. Возможно такая поддержка в будущем может появиться в средах NetBeans и IntelliJ, но она предусматривает несколько довольно тяжелых IDE-хаков для конкретной среды. Зато, все мастерские с Eclipse должны рассмотреть добавление Ломбок в своей ежедневный инструментарий прямо сегодня.
Прощай многословность POJO
С внедрением Проекта Ломбок, Reiner и Roel сделали многословие Java POJO достоянием истории. Когда вы добавите Ломбок к вашей ежедневной практике разработки, то просто не захотите возвращаться назад. Это очень просто и на наш взгляд, это самое революционное дополнение к экосистеме Java после рождения самого Eclipse.
Как использовать библиотеку Lombok
В предыдущей статье мы рассмотрели, подключить библиотеку Lombok к проекту и как установить плагин в IDE. Сегодня же мы расскажем, как использовать Lombok для уменьшения шаблонного кода при разработке программ.
Как использовать Lombok
При написании кода используются аннотации Lombok. С помощью аннатоций Lombok на этапе компиляции генерирует шаблонный код. С помощью аннотаций Lombok можно генерировать конструкторы классов, геттеры и сеттеры, методы toString, equals и hashCode. Давайте вкратце рассмотрим использование Lombok в работе.
Сеттеры и геттеры
Для генерации сеттеров и геттеров используются аннотации @Setter и @Getter, соответственно. Эти аннотации удобно навесить на POJO класс со множеством полей, дабы не генерировать шаблонный код самому.
Здесь мы объявили класс Person с тремя полями и указали аннотации @Getter и @Setter. Если вы правильно подключили Lombok и установили плагин, то он сразу же создаст геттеры и сеттеры. Теперь можно воспользоваться созданными методами:
Примечание: если вы определите какой-либо геттер или сеттер в классе, то Lombok не будет его трогать при генерации кода. То есть уже определённые методы будут иметь приоритет над вновь создаваемыми. Также для нестатических final полей не будут сгенерированы сеттеры.
Конструкторы
Рутинное написание типовых конструкторов можно поручить библиотеке Lombok, аннотировав нужный класс с помощью аннотаций @AllArgsConstructor, @RequiredArgsConstructor и @NoArgsConstructor. Как и следует из названий, эти аннотации приведут к генерированию таких конструкторов:
Эти аннотации можно комбинировать между собой и использовать вместе с аннотациями @Getter и @Setter.
Давайте определим класс Person с аннотациями @NoArgsConstructor и @AllArgsConstructor:
Как вы видите, Lombok сгенерировал конструктор без параметров и конструктор со всеми параметрами.
Примечание: при использовании в классе нестатических final полей невозможно использовать аннотацию @NoArgsConstructor, так как в конструкторе без параметров такие поля не будут инициализированы.
Методы toString, equals, и hashCode
Для создания метода toString воспользуйтесь аннотацией @ToString:
Выполнение данного кода выведет в консоль следующий текст:
Методы equals и hashCode генерируются с помощью аннотации @EqualsAndHashCode. Для простых классов вполне ясно и понятно использовать генерирование этих методов, но в нетривиальных случаях рекомендуется создавать equals и hashCode вручную (или средствами IDE).
Все методы воедино
Зачастую аннотации @Getter, @Setter, @ToString, @EqualsAndHashCode, и @RequiredArgsConstructor используются вместе для одного класса. Для такого типового подхода существует аннотация @Data, объединяющая все перечисленные аннотации.
С помощью аннотации @Data будут сгенерированы геттеры и сеттеры, конструктор со всеми final полями, методы toString, equals и hashCode. Эти два класса равнозначны:
Method chaining
Предположим, у нас есть класс с множеством полей. Использовать конструктор со всеми аргументами – не вариант, получится слишком длинный список аргументов. Вызывать по одному сеттеру в каждой строке может быть тоже непрактично. В этом случае можно воспользоваться аннотацией @Builder на нужном классе и использовать любой набор полей для построения объекта:
Начните построение объекта с вызова метода builder(), затем используйте нужные сеттеры, после чего вызовите метод build() для построения объекта.
Логгеры
Библиотеку Lombok можно использовать не только для моделей и POJO, но и для других классов – например, сервисов. Если в классе используется логгер, то генерирование этого поля можно поручить Lombok.
Например, вместо данного кода:
Можно написать следующий код, используя @Slf4j:
В аннотированном классе будет создано такое final поле с именем log.
Помимо @Slf4j, в Lombok есть ещё аннотации @Log и @CommonsLog. Эти аннотации отвечают за генерацию переменных следующих типов:
NonNull
Если пометить поле аннотацией @NonNull, то в случае, если будет попытка присвоить данному полю значение null, Lombok выбросит исключение:
Такое поведение будет аналогично тому, если бы мы написали в начале конструктора или сеттера проверку на null:
Переменные @var и константы @val
В Lombok есть интересные аннотации @var для обозначения «изменяемых» переменных и @val для констант. Обе эти аннотации применяются для обозначения локальных переменных.
Начиная с Java 10, синтаксис языка позволяет делать то же самое. Можно использовать val для объявления локальной константы и var для объявления локальной переменной. Особенностью данных двух ключевых слов является то, что тип переменной (или константы) будет определён компилятором автоматически. То есть не потребуется указывать тип переменной (константы) вручную:
Данные аннотации можно использовать и в «классическом» стиле:
В этом случае ошибки компиляции не будет, но значение константы не изменится при попытке её переопределить.
Заключение
В данной статье мы рассказали о ключевых возможностях библиотеки Lombok. С помощью Lombok вы можете упростить и ускорить ращработку программ, используя аннотации длягенерирования конструкторов (@AllArgsConstructor, @RequiredArgsConstructor и @NoArgsConstructor), геттеров и сеттеров (@Getter, @Setter), генерировать стандартные методы (@ToString, @EqualsAndHashCode), генерировать поле для логгера (@Log, @Slf4j, @CommonsLog), использовать функциональность val и var в версиях ниже Java 10. Дерзайте!
Проект Lombok, или Объявляем войну бойлерплейту
Подключаем Lombok
Lombok использует механизм процессинга аннотаций из Java 6, из чего следуют его минимальные требования к окружению. Для подключения Lombok к проекту достаточно включить его в зависимости. В случае использования Maven это делается следующим образом:
Для большей части функциональности Lombok эта библиотека необходима только на этапе компиляции. Последняя версия Lombok на текущий момент (0.11.0) ещё не попала в центральный репозиторий Maven, однако её без проблем можно установить в локальный или корпоративный репозиторий, скачав с сайта.
Прощаемся с аксессорами
Одним из главных источников бойлерплейта в Java является отсутствие свойств на уровне языка. Во соблюдение принципов ООП на каждое объявление поля приходится писать как минимум шесть типовых строк — геттер и сеттер. Некоторые библиотеки, вроде Spring или Tapestry, для своих целей в некоторых случаях позволяют разработчику забыть про аксессоры, вставляя их самостоятельно в байт-код. Подобную функциональность предлагает и Lombok.
Параметр lazy=true аннотации Getter позволяет реализовать ленивую инициализацию поля: вызов метода initMap() в данном случае будет отложен до первого вызова геттера и обёрнут в потокобезопасную инициализацию в виде блокировки с двойной проверкой.
Деструкция конструкторов
Конструкторы POJO-классов тоже не отличаются сложностью и разнообразием — чаще всего нам необходимо что-либо из этого списка: конструктор без параметров, конструктор со всеми параметрами, конструктор только с некоторыми обязательными параметрами, статический factory-метод. Lombok легко справляется с этой задачей с помощью аннотаций @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor и параметра staticName соответственно.
Вот что мы получим в результате:
Генерируем типовые методы: toString, hashCode, equals
О правильной реализации методов equals и hashCode написано достаточно много — пожалуй, стоит по этому поводу вспомнить «Effective Java» Блока и статью Одерски. Вкратце можно сказать, что реализовать их корректно — непросто, поддерживать в актуальном состоянии — ещё сложнее, а занимать они вполне могут добрую половину класса. Метод toString не так критичен для корректности кода, но актуализировать его каждый раз при изменении класса — тоже приятного мало. Предоставим возможность Lombok сделать за нас эту неблагодарную работу с помощью двух нехитрых аннотаций:
Логгер-невидимка
Если вы пользуетесь одной из популярных библиотек протоколирования, то, вероятнее всего, в каждом классе у вас присутствует статическое объявление логгера:
Вместо этого Lombok предлагает воспользоваться аннотациями Log, @CommonsLog, @Log4j или @Slf4j — в зависимости от предпочитаемого средства протоколирования:
Финализируем локальные переменные
Хорошим стилем программирования является использование финальных локальных переменных, однако, учитывая статическую типизацию и отсутствие в Java выведения типов, объявление какой-нибудь особенно навороченной карты вполне может вылезть за пределы экрана. Если с Java переходить на Scala или Groovy пока не хочется, то можно воспользоваться следующим хаком Lombok:
Переменная map в данном случае будет объявлена как final, в то же время описание её типа будет взято из правой части выражения присваивания.
Безнаказанно бросаем исключения
Далеко не все разработчики, к сожалению, читали уже упоминавшуюся здесь «Effective Java» Блока или «Robust Java» Стелтинга. А может, читали, но не очень внимательно. Или, возможно, у них и впрямь была какая-то вполне обоснованная мотивация объявить вот это конкретное исключение проверяемым — но вам от этого не легче, ведь вы-то знаете, что оно не возникнет никогда! Что делать, например, с UnsupportedEncodingException, если вы абсолютно уверены, что без системной поддержки кодировки UTF-8 ваше приложение всё равно работать не будет? Приходится заключать код в try-catch и писать бессмысленный вывод в лог, который никогда не дождётся своего часа, переоборачивать исключение в runtime-обёртку, которой не суждено появиться на свет, или и вовсе игнорировать пустым блоком перехвата (который, не знаю, как у вас, а у меня лично всегда вызывает желание схватиться за револьвер). Lombok и здесь предлагает альтернативу.
Для этого колдунства, в отличие от всего прочего, понадобится подключить Lombok в рантайме. Всё просто: Lombok усыпляет бдительность компилятора, перехватывая исключение в try, а затем в рантайме незаметно перевыбрасывает его в catch. Фишка в том, что на уровне байт-кода можно выбросить любое исключение, даже то, которое не объявлено в сигнатуре метода.
Правильная синхронизация
Многопоточность — весьма сложная область программирования, имеющая в Java свою идиоматику и паттерны. Одной из правильных практик является использование для синхронизации приватных финальных полей, так как на любом общедоступном локе может пожелать синхронизироваться какой-либо не связанный кусок функциональности, что приведёт к ненужным блокировкам и трудно отлавливаемым ошибкам. Lombok умеет корректно синхронизировать содержимое метода, отмеченного аннотацией @Synchronized — как статического, так и метода экземпляра:
А что на это скажет IDE?
Все эти замечательные фишки ничего бы не стоили, если бы при открытии проекта в Eclipse или IntelliJ IDEA строчки кода разгорались бы красным пламенем от праведного гнева компилятора. К счастью, интеграция со средами разработки имеется, и достаточно неплохая. Для IntelliJ IDEA плагин присутствует в стандартном репозитории:
Для Eclipse и NetBeans установка немного необычная. Необходимо запустить файл lombok.jar, и он покажет симпатичный инсталлятор, предлагающий накатить Lombok на существующие инсталляции Eclipse:
Указанные плагины не только убеждают среду разработки в том, что отсутствие геттеров, сеттеров и прочих элементов бойлерплейта ей только чудится — они ещё и корректно подсвечивают ошибочные ситуации, например, когда геттер, которому надлежит быть сгенерированным, уже присутствует в классе:
Я перечислил основные фишки Lombok, однако это ещё не всё. Более подробно все возможные аннотации со всеми атрибутами и со сравнением кода «до» и «после» описаны в документации.
Проект Ломбок: Сокращение Стандартного Кода Java
Обзор
Таким образом, с помощью Lombok вы можете избавиться от всех методов получения и настройки, хэш-кода, методов равенства и многого другого, просто добавив аннотации.
Установка на Ломбоке
Установка Ломбока в Eclipse
Это запустит программу установки:
Если он автоматически не определил местоположение предпочитаемой среды разработки, вы можете указать местоположение вручную, а затем завершить установку, нажав “Установить/обновить”.
Вы можете проверить, активна установка или нет, в диалоговом окне Eclipse “О программе” в конце текста об авторских правах:
Установка Ломбока в NetBeans
Установка Ломбока в IntelliJ
Идея IntelliJ позволяет очень легко устанавливать плагины в IDE:
Найдите Плагин Lombok и нажмите Установить плагин
После этого просто перезапустите среду разработки, и все готово.
Зависимость от Ломбока
Нам нужно добавить следующую зависимость в ваш pom.xml:
Примечание: Область действия предоставлена поскольку Lombok является чистой зависимостью от сборки, а не зависимостью во время выполнения. Это означает, что мы ожидаем, что приложение предоставит нам зависимость от времени выполнения.
Аннотации на Ломбоке
@Добытчик и @Сеттер
Эти аннотации можно использовать как на уровне поля, так и на уровне класса. Если он используется на уровне класса, он будет генерировать геттеры и сеттеры для всех полей в классе:
Как видно из окна IDE, оба поля теперь имеют свои соответствующие методы получения и настройки, хотя на самом деле мы сами их не определяли.
Если вам нужны геттеры/сеттеры только для определенных полей, соответствующим образом их аннотируйте:
Если вы хотите изменить уровень доступа к сгенерированным методам и полям, вы можете сделать это с помощью аргумента Уровень доступа :
Существует несколько уровней доступа, которые Ломбок предлагает в виде аргументов:
Аннотации конструктора
@AllArgsConstructor
@AllArgsConstructor декоратор создаст общедоступный конструктор, все поля, объявленные в вашем классе, будут расположены в том же порядке, в каком они определены:
Сгенерированный конструктор будет выглядеть следующим образом:
@NoArgsConstructor
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
@NoArgsConstructor создаст конструктор без аргументов:
Сгенерированный конструктор будет выглядеть следующим образом:
Примечание: Если конструктор не может быть создан из-за наличия окончательных полей, появится сообщение об ошибке.
@RequiredArgsConstructor
@RequiredArgsConstructor создаст конструктор со всеми окончательными полями в классе:
Сгенерированный конструктор будет выглядеть следующим образом:
Примечание: @NoArgsConstructor и @RequiredArgsConstructor не могут использоваться вместе и вызовут ошибку времени компиляции, если вы попытаетесь это сделать.
@EqualsAndHashCode
@EqualsAndHashCode может использоваться на уровне класса, который будет генерировать реализации для equals(Объект другой) и hashCode() методов.
По умолчанию он будет использовать все нестатические и нестационарные поля:
@toString
@Данные
@Значение
Иногда вы хотите, чтобы ваш объект оставался неизменным после его создания. @Value является неизменяемым вариантом @Data и используется именно для этой цели.
По умолчанию все поля являются окончательными, а задатчики не создаются:
@Строитель
Шаблон конструктора-это шаблон творческого проектирования, который используется для пошагового построения объектов.
Как вы, возможно, уже знаете, хотя шаблон компоновщика позволяет создавать экземпляры объектов более подробным и чистым способом, чем с помощью конструкторов, базовый код, необходимый для реализации шаблона, довольно запутан.
@Builder позволяет автоматически создавать код, необходимый для этого:
Теперь вы можете создать объект User с помощью шаблона компоновщика без всего кода, необходимого для его поддержки:
Регистрация
В нашем приложении часто используются регистраторы, и обычно нам нужно инициализировать переменную журнала в верхней части класса, а затем использовать ее в наших методах.
@@Log создает переменную журнала с java.util.logging.Logger.getLogger(Пример журнала.класс.getName()) объект.
Написание Потокобезопасных Методов
В Java для многопоточных приложений мы используем ключевое слово synchronized в критических разделах кода.
Обычно мы используем синхронизированный блок с объектом в качестве блокировки:
Это может быть автоматически сгенерировано с помощью ключевого слова @Synchronized :
Вывод
В этой статье мы представили введение в проект Ломбок и увидели, как он облегчает наш процесс разработки, сокращая стандартный код с помощью простых аннотаций. Это значительно повышает читабельность и краткость.
Lombok возвращает величие Java
Мы в Grubhub почти во всём бэкенде используем Java. Это проверенный язык, который за последние 20 лет доказал свою скорость и надёжность. Но с годами возраст «старичка» всё-таки начал сказываться.
Java — один из самых популярных языков JVM, но не единственный. В последние годы конкуренцию ему составляют Scala, Clojure и Kotlin, которые обеспечивают новую функциональность и оптимизированные функции языка. Короче говоря, они позволяют делать больше с более лаконичным кодом.
Эти инновации в экосистеме JVM очень интересные. Из-за конкуренции Java вынуждена меняться, чтобы сохранить конкурентоспособность. Новый шестимесячный график выпуска и несколько JEP (JDK enhancement proposals) в Java 8 (Valhalla, local-Variable Type Inference, Loom) — доказательство того, что Java долгие годы останется конкурентоспособным языком.
Тем не менее, размер и масштаб Java означают, что разработка продвигается медленнее, чем мы хотели бы, не говоря уже о сильном желании любой ценой поддерживать обратную совместимость. В любой разработке первым приоритетом должны быть функции, однако здесь необходимые функции слишком долго разрабатываются, если вообще попадают в язык. Поэтому мы в Grubhub используем Project Lombok, чтобы прямо сейчас иметь в своём распоряжении оптимизированную и улучшенную Java. Проект Lombok — это плагин компилятора, который добавляет в Java новые «ключевые слова» и превращает аннотации в Java-код, уменьшая усилия на разработку и обеспечивая некоторую дополнительную функциональность.
Настройка Lombok
Grubhub всегда стремится улучшить жизненный цикл программного обеспечения, но каждый новый инструмент и процесс имеет стоимость, которую следует учесть. К счастью, для подключения Lombok достаточно добавить всего пару строк в файл gradle.
Lombok преобразует аннотации в исходном коде в Java-операторы до того, как компилятор их обработает: зависимость lombok отсутствует в рантайме, поэтому использование плагина не увеличит размер сборки. Чтобы настроить Lombok с Gradle (он также работает с Maven), просто добавьте в файл build.gradle такие строки:
При использовании Lombok наш исходный код не будет валидным кодом Java. Поэтому потребуется установить плагин для IDE, иначе среда разработки не поймёт, с чем имеет дело. Lombok поддерживает все основные Java IDE. Интеграция бесшовная. Все функции вроде «показать использования» и «перейти к реализации» продолжают работать как и раньше, перемещая вас к соответствующему полю/классу.
Lombok в действии
Лучший способ познакомиться с Lombok — увидеть его в действии. Рассмотрим несколько типичных примеров.
Оживить объект POJO
При помощи «старых добрых объектов Java» (POJO) мы отделяем данные от обработки, чтобы сделать код проще для чтения и упростить сетевые передачи. В простом POJO есть несколько приватных полей, а также соответствующие геттеры и сеттеры. Они справляются с работой, но требуют большого количества шаблонного кода.
Lombok помогает использовать POJO более гибким и структурированным образом без дополнительного кода. Вот так с помощью аннотации @Data мы упрощаем базовый POJO:
@Data — просто удобная аннотация, которая применяет сразу несколько аннотаций Lombok.
Генерация билдера упрощает создание объектов с большим количеством аргументов и добавлением новых полей в будущем. Статический метод возвращает экземпляр билдера для задания всех свойств объекта. После этого вызов build() возвращает инстанс.
С помощью всего нескольких простых аннотаций базовый POJO получил так много богатых функций, которые упрощают его использование, не загружая работой нас, инженеров, не отнимая время и не увеличивая затраты на разработку.
Удаление шаблонного кода
Lombok полезен не только для POJO: его можно применить на любом уровне приложения. Следующие способы использования Lombok особенно полезны в классах компонентов, таких как контроллеры, службы и DAO (объекты доступа к данным).
Ведение журнала — базовое требование для всех частей программы. Любой класс, выполняющий значимую работу, должен записывать лог. Таким образом, стандартный логгер становится шаблоном для каждого класса. Lombok упрощает этот шаблон до одной аннотации, которая автоматически определяет и создаёт экземпляр логгера с правильным именем класса. Существует несколько различных аннотаций в зависимости от структуры журнала.
После объявления логгера добавляем наши зависимости:
Но подождите, это ещё не всё!
Есть ещё много ситуаций, где Lombok проявляет себя с лучшей стороны. Предыдущие разделы показывали конкретные примеры, но Lombok может облегчить разработку во многих областях. Вот несколько небольших примеров, как эффективнее его использовать.
Сравнение бок о бок
Класс Lombok — всего лишь 13 простых, читаемых, понятных строк. Но после запуска de-lombok, класс превращается более чем в сто строк шаблонного кода!
Вот примерный аналог в стандартном Java-коде.
Оценка эффекта
На портале Grubhub более ста бизнес-сервисов, связанных с доставкой еды. Мы взяли один из них и запустили функцию “de-lombok” в плагине Lombok IntelliJ. В результате изменилось около 180 файлов, а кодовая база выросла примерно на 18 000 строк кода после удаления 800 случаев использований Lombok. В среднем, каждая строка Lombok экономит 23 строки Java. С таким эффектом трудно представить Java без Lombok.
Резюме
Lombok — отличный помощник, который реализует новые функции языка, не требуя особых усилий со стороны разработчика. Конечно, проще установить плагин, чем обучить всех инженеров новому языку и портировать существующий код. Lombok не всесилен, но уже из коробки достаточно мощный, чтобы реально помочь в работе.
Ещё одно преимущество Lombok в том, что он сохраняет согласованность кодовых баз. У нас более ста различных сервисов и распределённая команда по всему миру, так что согласованность кодовых баз облегчает масштабирование команд и снижает нагрузку на переключение контекста при запуске нового проекта. Lombok работает для любой версии начиная с Java 6, поэтому мы можем рассчитывать на его доступность во всех проектах.
Для Grubhub это больше, чем просто новые функции. В конце концов, весь этот код можно написать вручную. Но Lombok упрощает скучные части кодовой базы, не влияя на бизнес-логику. Это позволяет сфокусироваться на вещах, действительно важных для бизнеса и наиболее интересных для наших разработчиков. Монтонный шаблонный код — это пустая трата времени программистов, рецензентов и мейнтейнеров. Кроме того, поскольку этот код больше не пишется вручную, то устраняет целые классы опечаток. Преимущества автогенерации в сочетании с мощью @NonNull уменьшают вероятность ошибок и помогают нашей разработке, которая направлена на доставку еды к вашему столу!