Разломбочивание

DarksideProject автоматизирует написание одного и того же кода и позволяет сосредоточиться на задаче и при этом писать более простой и понятный код. С другой стороны, первый постулат Пардо напоминает: «Все, что есть хорошего в жизни, либо незаконно, либо аморально, либо ведет к ожирению». Какова цена удобства, которое привносит ?

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

Из этого недостатка вытекают другие — вся экосистема не готова к project lombok. Расчёт покрытия unit тестами будет давать неверные оценки. Анализатор PMD будет ругаться на недоступные поля. FindBugs будет ругаться на некорректное исползьование методов (хотя с недавних пор это отключаемо). AspectJ вообще не способен собрать проект с lombok.

Что же делать? Есть ли возможность писать простой код с project lombok и при этом минимизировать ущерб от него? Авторы lombok называют эту возможность разломбочиванием «delomboking».

Проще всего, если эта операция не требуется часто, разломбочить вручную:

Разломбоченный код настолько большой, что пришлось спрятать его.

Для maven существует особый плагин, интегрирующий разломбочивание в сборочный ковейер.

Плагин ожидает, что весь код, требующий разломбочивания, будет лежать в src/main/lombok, а разломбоченный код будет помещён в target/generated-sources/delombok, откуда его уже подхватит компилятор и скомпилирует. Код, лежащий в src/main/java, будет скомпилирован как обычно.

В gradle поддержка project lombok так же осуществляется отдельным плагином:

Поскольку в Gradle из коробки нет scope provided, как в maven, наличие плагина обязательно для корректной компиляции кода с lombok. Разломбочивание реализуется отдельным gradle task и требует дополнительной настройки (просто скопируйте task из примера :)).

Код примера доступен на github.