Насколько безопасно использовать Project Lombok?

Если вы не знаете, Project Lombok помогает с некоторыми неудобствами Java с помощью таких вещей, как создание геттеров и сеттеров с аннотациями и даже простая генерация типа JavaBean с @Data. Это действительно может мне помочь, особенно в 50 различных объектах событий, где у вас есть до 7 разных полей, которые необходимо создать и скрыть с помощью геттеров. С его помощью я мог удалить почти тысячу строк кода.

Однако меня беспокоит, что в конечном итоге это будет печальное решение. Когда я упоминаю об этом, в ##Java Freenode канале вспыхнут войны, и предоставление фрагментов кода запутает возможных помощников, люди будут жаловаться на отсутствие JavaDoc, а будущие коммитеры все равно могут просто удалить его. Мне бы очень понравилось положительное, но меня беспокоит отрицательное.

Итак: безопасно ли использовать Lombok в любом проекте, большом или маленьком? Стоит ли положительный эффект отрицательного?


person TheLQ    schedule 04.10.2010    source источник
comment
Добавление поддержки компилятора jdk9 # 985 не решено на момент написания моего комментария. Система пакетов Java 9 требует добавления большого количества опций CLI в javac, чтобы открыть доступ к внутренним sun.* классам ((   -  person gavenkoa    schedule 22.09.2017
comment
В наши дни проекты используют препроцессор аннотаций, встроенный в javac, чтобы делать такие вещи - этот механизм является стандартным, и от хороших программистов можно ожидать, что он это знает.   -  person Thorbjørn Ravn Andersen    schedule 12.11.2018


Ответы (15)


Похоже, вы уже решили, что Project Lombok дает вам значительные технические преимущества для вашего предлагаемого нового проекта. (Чтобы быть ясным с самого начала, у меня нет особых взглядов на Project Lombok, так или иначе.)

Прежде чем использовать Project Lombok (или любую другую технологию, меняющую правила игры) в каком-либо проекте (с открытым исходным кодом или другим способом), вам необходимо убедиться, что заинтересованные стороны проекта согласны с этим. Сюда входят разработчики и все важные пользователи (например, официальные или неофициальные спонсоры).

Вы упомянули эти потенциальные проблемы:

Когда я упомяну об этом, на канале ## Java Freenode вспыхнут пламенные войны,

Легкий. Игнорируйте / не участвуйте в огненных войнах или просто воздержитесь от упоминания Ломбока.

предоставление фрагментов кода запутает возможных помощников,

Если стратегия проекта заключается в использовании Lombok, то возможные помощники должны будут к нему привыкнуть.

люди будут жаловаться на отсутствие JavaDoc,

Это их проблема. Никто в здравом уме не пытается жестко применять правила исходного кода / документации своей организации к стороннему программному обеспечению с открытым исходным кодом. Команда проекта должна иметь право устанавливать стандарты исходного кода / документации проекта, соответствующие используемой технологии.

(ПОСЛЕДУЮЩИЕ - разработчики Lombok осознают, что не создание комментариев javadoc для синтезированных методов получения и установки является проблемой. Если это серьезная проблема для вашего проекта (проектов), то альтернативой является создание и отправка патч Lombok для решения этой проблемы.)

и будущие коммитеры все равно могут все это удалить.

Это не работает! Если согласованная стратегия проекта заключается в использовании Lombok, то коммитеры, которые безвозмездно де-Lombok кодируют код, должны быть наказаны, и, если необходимо, их права на коммит должны быть отозваны.

Конечно, это предполагает, что у вас есть поддержка заинтересованных сторон ... включая разработчиков. И это предполагает, что вы готовы отстаивать свою точку зрения и надлежащим образом справляться с неизбежными несогласными.

person Stephen C    schedule 04.10.2010
comment
А как насчет небольших проектов с открытым исходным кодом? Ваше представление о согласии команды действительно хорошее, но мне также интересно с точки зрения проекта ОС для 1-2 человек. - person TheLQ; 04.10.2010
comment
На самом деле тот же принцип, за исключением того, что получение согласия одного человека (вас самих) - не проблема. Я предполагаю, что это могло бы отпугнуть других возможных участников проекта, но люди, которых откладывали бы, вероятно, в любом случае не те люди, которые вам нужны. К тому же они гипотетические. - person Stephen C; 04.10.2010
comment
Я думаю, когда он говорит об отсутствии JavaDoc, он имеет в виду, что у геттеров и сеттеров не будет JavaDoc, что не очень хорошо. - person Denis Tulskiy; 04.10.2010
comment
Как разработчик Lombok могу сказать, что создание javadoc технически возможно. Примите участие в группе Google, если у вас есть блестящие идеи, как это реализовать. Я имею в виду, что просто создание стандартного текста не так уж и полезно. Как и getFoo, возвращает foo, setFoo устанавливает foo? Как это поможет? - person Roel Spilker; 04.10.2010
comment
Я бы сказал, что javadoc для bean-геттеров / сеттеров приносит больше вреда, чем пользы. Эти методы следуют хорошо понятному соглашению, которое не нужно добавлять в javadoc; это только добавляет шума. Добавляйте документацию к геттерам и сеттерам только тогда, когда они делают что-то неожиданное, например, когда у них есть побочные эффекты. - person GaryF; 04.10.2010
comment
Я только что понял, что замечание javadoc может относиться к тому факту, что если вы создаете javadoc для своего ломбокированного кода, геттеры и сеттеры не отображаются вообще. Способ исправить это - запустить javadoc поверх вашего кода с удаленным блоком. - person Roel Spilker; 05.10.2010
comment
Похоже, что javadoc для сгенерированных геттеров и сеттеров войдет следующий выпуск Lombok, но только в скомпилированном коде, а не в Eclipse. - person Don Kirkby; 01.08.2013
comment
@GaryF Правда? Как насчет документирования того, может ли значение быть нулевым? Или допустимый диапазон числового значения? Или допустимая длина и / или формат значения String? Или подходит ли значение String для представления конечному пользователю? Или документирование того, что на самом деле означает свойство, когда его название не может объяснить его полностью? (JList.getLayoutOrientation и JList.setLayoutOrientation в голову приходит.) - person VGR; 04.11.2015
comment
@VGR - это несколько полезных контрпримеров того, где, да, нам может понадобиться Javadoc. Я бы все же сказал в целом, что большинство Javadoc для геттеров / сеттеров - это шум: автоматически сгенерированные документы для в основном сгенерированных или тривиальных свойств для получения / настройки. Не забывайте и о контексте: Lombok предназначен для создания геттеров / сеттеров для простых полей в стиле свойств, а не там, где применяется дополнительная логика проверки. - person GaryF; 04.11.2015
comment
@GaryF Это шум, потому что разработчикам лень документировать по существу. Документация особенно необходима для бизнес-объектов. Я потерял счет числу классов компонентов, с которыми имел дело, свойства которых не имели смысла для тех, у кого не было месяцев или лет знаний в конкретной предметной области. Большинство разработчиков документируют getDate() с помощью javadoc, в котором просто написано Gets this object's date, что может показаться подтверждением вашего аргумента, но на самом деле разработчик должен был объяснить, для чего указана дата. (Дата подачи? Дата создания? Срок действия? Дата истечения срока?) - person VGR; 04.11.2015
comment
@VGR Я согласен с тем, что вы говорите в целом, но лучшее решение в этом конкретном случае - это лучше именование, а не комментарии. т.е. getCreationDate, getDueDate. Там, где это возможно, имена важнее комментариев. - person GaryF; 06.11.2015
comment
IMO имеет смысл использовать javadoc в самом поле, чтобы фиксировать знания, специфичные для домена, а не повторять его как в геттере, так и в сеттере. (опоздал на вечеринку, я знаю) - person Kyrstellaine; 12.05.2017

Только сегодня начал использовать Ломбок. Пока мне это нравится, но один недостаток, о котором я не упомянул, - это поддержка рефакторинга.

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

Я предполагаю, что это нужно сделать через плагин IDE, а не через Lombok.

ОБНОВЛЕНИЕ (22 января 2013 г.)
После трех месяцев использования Lombok я все еще рекомендую его для большинства проектов. Однако я обнаружил еще один недостаток, похожий на тот, который был указан выше.

Если у вас есть класс, скажем MyCompoundObject.java, который имеет 2 члена, оба аннотированы @Delegate, скажем myWidgets и myGadgets, когда вы вызываете myCompoundObject.getThingies() из другого класса, невозможно узнать, делегирует ли он Widget или Gadget, потому что вы больше не можете перейти к исходный код в среде IDE.

Использование методов Eclipse Generate Delegate ... предоставляет вам те же функции, так же быстро и обеспечивает переход от исходного кода. Обратной стороной является загромождение исходного кода стандартным кодом, который отвлекает внимание от важных вещей.

ОБНОВЛЕНИЕ 2 (26 февраля 2013 г.)
Спустя 5 месяцев мы все еще используем Lombok, но у меня есть другие неприятности. Отсутствие объявленного геттера и сеттера может раздражать время от времени, когда вы пытаетесь ознакомиться с новым кодом.

Например, если я вижу метод с именем getDynamicCols(), но не знаю, о чем он, мне нужно преодолеть некоторые дополнительные препятствия, чтобы определить цель этого метода. Некоторые из препятствий - это Lombok, некоторые - отсутствие умного плагина Lombok. Препятствия включают:

  • Отсутствие JavaDocs. Если я javadoc поле, я надеюсь, что геттер и сеттер унаследуют этот javadoc на этапе компиляции Lombok.
  • При переходе к определению метода я перехожу к классу, но не к свойству, создавшему получатель. Это проблема с плагином.
  • Очевидно, вы не можете установить точку останова в геттере / сеттере, если вы не сгенерируете или не закодируете метод.
  • ПРИМЕЧАНИЕ. Этот справочный поиск не является проблемой, как я сначала думал. Тем не менее, вам нужно использовать перспективу, которая включает вид Outline. Не проблема для большинства разработчиков. Моя проблема заключалась в том, что я использую Mylyn, который фильтрует мое Outline представление, поэтому я не видел методов. Отсутствие поиска по ссылкам. Если я хочу увидеть, кто звонит getDynamicCols(args...), мне нужно сгенерировать или закодировать установщик, чтобы иметь возможность искать ссылки.

ОБНОВЛЕНИЕ 3 (7 марта 2013 г.)
Думаю, я учусь использовать различные способы работы в Eclipse. Фактически вы можете установить условную точку останова (BP) для метода, созданного Lombok. Используя представление Outline, вы можете щелкнуть метод правой кнопкой мыши, чтобы Toggle Method Breakpoint. Затем, когда вы нажимаете BP, вы можете использовать представление Variables отладки, чтобы увидеть, как сгенерированный метод назвал параметры (обычно то же самое, что и имя поля), и, наконец, используйте представление Breakpoints, чтобы щелкнуть правой кнопкой мыши BP и выбрать Breakpoint Properties..., чтобы добавить состояние. Хороший.

ОБНОВЛЕНИЕ 4 (16 августа 2013 г.)
Netbeans не любит, когда вы обновляете зависимости Lombok в своем Maven pom. Проект все еще компилируется, но файлы помечаются как имеющие ошибки компиляции, потому что он не может видеть методы, которые создает Lombok. Очистка кеша Netbeans решает проблему. Не уверен, что есть опция «Чистый проект», как в Eclipse. Незначительная проблема, но я хотел об этом сообщить.

ОБНОВЛЕНИЕ 5 (17 января 2014 г.)
Lombok не всегда хорошо ладит с Groovy или, по крайней мере, с groovy-eclipse-compiler. Возможно, вам придется перейти на более раннюю версию компилятора. Maven Groovy и Java + Lombok

ОБНОВЛЕНИЕ 6 (26 июня 2014 г.)
Предупреждение. Ломбок вызывает легкое привыкание, и если вы работаете над проектом, в котором по какой-то причине не можете его использовать, он вас до чертиков разозлит. Возможно, вам лучше просто никогда его не использовать.

ОБНОВЛЕНИЕ 7 (23 июля 2014 г.)
Это немного интересное обновление, поскольку оно напрямую касается безопасности принятия Lombok, о котором спрашивал ОП.

Начиная с версии 1.14, аннотация @Delegate переведена в экспериментальный статус. Подробности описаны на их сайте (Lombok Delegate Docs).

Дело в том, что если вы использовали эту функцию, ваши возможности возврата ограничены. Я вижу варианты как:

  • Вручную удалите @Delegate аннотации и сгенерируйте / закодируйте код делегата. Это немного сложнее, если вы использовали атрибуты в аннотации.
  • Деломбокируйте файлы с аннотацией @Delegate и, возможно, добавьте обратно в аннотации, которые вам нужны.
  • Никогда не обновляйте Lombok и не поддерживайте форк (или используйте экспериментальные функции).
  • Деломбок весь свой проект и перестань использовать Ломбок.

Насколько я могу судить, Деломбок не есть возможность удалить часть аннотаций; это все или ничего, по крайней мере, для контекста одного файла. Я открыл билет для запроса этой функции с флагами Delombok, но Я бы не ожидал этого в ближайшем будущем.

ОБНОВЛЕНИЕ 8 (20 октября 2014 г.)
Если это вам вариант, Groovy предлагает большинство тех же преимуществ Lombok, а также множество других функций, включая @ Delegate. Если вы думаете, что вам будет сложно продать идею сильным мира сего, взгляните на аннотацию @CompileStatic или @TypeChecked, чтобы узнать, поможет ли это вашему делу. Фактически, в выпуске Groovy 2.0 основное внимание уделялось статической безопасности.

ОБНОВЛЕНИЕ 9 (1 сентября 2015 г.)
Lombok все еще активно поддерживается и совершенствуется , что предвещает безопасный уровень усыновления. Аннотации @Builder - одна из моих любимых новых функций.

ОБНОВЛЕНИЕ 10 (17 ноября 2015 г.)
Может показаться, что это не имеет прямого отношения к вопросу ОП, но стоит поделиться. Если вам нужны инструменты, которые помогут сократить объем написанного шаблонного кода, вы также можете воспользоваться Google Auto - в частности, AutoValue. Если вы посмотрите на их person Snekse    schedule 09.10.2012

comment
Спасибо, я думаю, это была информация, которую ОП действительно хотел, а не философский ответ. - person chaostheory; 01.03.2013
comment
UPDATE 6 очень похож на Scala :) - person mauhiz; 07.10.2015
comment
@mauhiz И Groovy. Если бы мне когда-либо приходилось работать в таком месте, где я не мог бы использовать Groovy или Scala хотя бы для тестирования, я бы, вероятно, уволился через короткий промежуток времени. - person Snekse; 07.10.2015
comment
Я забуду о Ломброке. Кстати, приятный обзор :) - person severin.julien; 27.05.2016
comment
Мне очень нравится ваш ответ в стиле обновления с течением времени. Это действительно помогает, особенно для вопросов и ответов в этом стиле. - person MattG; 29.07.2016
comment
Отличная работа! Вы только что убедили меня добавить Ломбок в наш проект! спасибо спасибо спасибо! - person jfneis; 26.01.2017
comment
25 лучших ответов на SO прямо здесь. - person Dmitry Minkovsky; 29.01.2017
comment
У проекта Lombok есть новая бета-версия, которая, похоже, исправляет большинство проблем с java 9. - person Keyhan; 11.12.2017
comment
Похоже, теперь доступна поддержка Java 9. Вы можете обновить свой ответ. stackoverflow.com/questions/41520511/ - person leventunver; 04.03.2018
comment
Очень полезно, очень красиво написано - person Vivek Panday; 04.03.2018
comment
это читается как роман. - person MK.; 27.03.2018
comment
Спасибо за занимательный и информативный ответ. Я возвращаюсь к Java с JavaScript и Kotlin, и Lombok очень заманчиво. Но я пишу код, который в конечном итоге будет передан другим (больше не скажу), и в данном конкретном случае это кажется слишком далеким мостом. - person MikeThomas; 24.07.2018
comment
@MikeThomas Я думаю, что больше всего меня не устраивает интеграция с IDE. Это не просто репозиторий Clone, запустите инструмент сборки. Хотя это довольно легко покрыть с помощью проекта README и ссылки на документы Lombok, которые довольно хороши. И, возможно, ссылка на этот ТАК ответ :-) - person Snekse; 24.07.2018
comment
Хороший ответ! +1 за то, что постоянно отвечаю на вопросы о различных событиях вокруг Ломбока. - person Anshul Goyal; 10.09.2018
comment
Лучший ответ, который я читал на SO до сих пор +1 - person raevilman; 17.12.2018
comment
Очень ценю своевременный ответ. Одна вещь, которую я хотел бы добавить, - это метод Careful with ToString(), он вызовет бесконечную рекурсию с отношениями Джексона и JPA, такими как ManyToMany , OneToMany. Я обычно использую аннотации Lombok @Getter, @Setter и реализую equals() и hashCode() отдельно - person Pavan Jadda; 22.06.2019
comment
это должен быть принятый ответ - person nomadSK25; 08.07.2019
comment
Очень хороший ответ, но мне не хватает одного момента: я думаю, что это небезопасно, если использовать его неуместно. Например, если вы добавите частного члена, вы можете ожидать, что он действительно будет приватным, но Lombok действительно генерирует геттеры и сеттеры. И что еще хуже, если вы позже добавите закрытый член в класс Lombok, он автоматически добавится к методам equals и hashcode и может сломать ваше приложение. Если бы это было закодировано вручную, этого бы не произошло. Но пока вы используете Lombok для простых POJO, это должно быть безопасно. - person Datz; 18.09.2019
comment
@Datz Это о разработчике, который добавляет этого частного участника. Если вы действительно хотите, чтобы он был приватным, вам нужно исключить его из этих аннотаций. И если вы решите для своего проекта, что риск не стоит того, тогда ваша команда может установить lombok.data.flagUsage реквизиты для аннотаций, которые вы хотите запретить, и продолжать использовать другие вещи, которые, по вашему мнению, приносят пользу. - person Snekse; 18.09.2019
comment
@Snekse Верно, это то, что я имел в виду с , я думаю, что использовать его неуместно небезопасно! - person Datz; 19.09.2019
comment
Это один из тех ответов Зала славы, который должен был стать общепринятым. Спасибо за ваш вклад! - person Mayank Sharma; 22.01.2021
comment
Есть ли альтернативы использованию @Data в моих Java-классах POJO, если я хочу скрыть весь шаблонный код? Любые другие, которые считаются безопасными / безопасными в последних версиях Java? - person Coder; 05.06.2021
comment
@Coder Вас беспокоит конкретно аннотация @Data или Ломбок в целом? Если вам просто не нравится аннотация к данным, есть @Value, @Builder и пара других аннотаций, которые вы можете смешивать и сопоставлять - person Snekse; 06.06.2021
comment
@Snekse просто Lombok в целом, мне сказали, что есть недостатки с использованием Lombok в Gradle, поэтому я ищу альтернативы - person Coder; 07.06.2021
comment
@Coder В настоящее время я использую Lombok с Gradle. Я никогда не пробовал использовать Lombok в Gradle. Если бы вы думали об этом, я бы подумал о создании проекта плагина, который будет компилироваться в jar, который используется вместо этого. Тогда я не понимаю, почему вы столкнулись с проблемой. - person Snekse; 08.06.2021

Продолжайте и используйте Lombok, вы можете, если необходимо, "деломбок" свой код впоследствии http://projectlombok.org/features/delombok.html < / а>

person Kennet    schedule 04.10.2010
comment
@fastcodejava, когда вы говорите +1 для x, x должен быть одной из перечисленных точек, а не единственной точкой :) - person Kerem Baydoğan; 21.05.2014
comment
В этой конкретной ситуации я интерпретировал +1 для деломбока как да здравствует деломбок. Мне это нравится. - person Zoltán; 04.02.2015
comment
+1 за деломбок - особенно актуально, когда вы хотите использовать ломбок в проектах, которые будут предоставляться вашим клиентам. Вы можете воспользоваться всеми преимуществами ломбока и позволить своим клиентам видеть чистую банку без зависимости от ломбока. - person fwonce; 22.01.2017
comment
Для людей, думающих нормально, я попробую Ломбок, а если мне это не понравится, я просто Деломбок: подумайте дважды. Запуск Деломбока - болезненный процесс. И полученный код будет работать так же, как и с Lombok ... но это также будет полный беспорядок. - person AJPerez; 26.08.2019

Лично (и, следовательно, субъективно) я обнаружил, что использование Lombok делает мой код более выразительным в отношении того, чего я пытаюсь достичь, по сравнению с IDE / собственными реализациями сложных методов, таких как hashcode & equals.

Когда используешь

@EqualsAndHashCode(callSuper = false, of = { "field1", "field2", "field3" })

намного проще поддерживать согласованность Equals и HashCode и отслеживать, какие поля оцениваются, чем любая IDE / собственная реализация. Это особенно верно, когда вы все еще регулярно добавляете / удаляете поля.

То же самое касается аннотации @ToString и ее параметров, которые четко передают желаемое поведение в отношении включенных / исключенных полей, использования геттеров или доступа к полям, а также для вызова super.toString().

И снова, аннотируя весь класс с помощью @Getter или @Setter(AccessLevel.NONE) (и, возможно, отменяя любые расходящиеся методы), сразу становится ясно, какие методы будут доступны для полей.

Выгоды продолжаются и продолжаются.

На мой взгляд, речь идет не о сокращении кода, а о четком изложении того, чего вы хотите достичь, вместо того, чтобы выяснять это из Javadoc или реализаций. Сокращенный код просто упрощает обнаружение любых реализаций расходящихся методов.

person Tim    schedule 04.10.2010
comment
И чтобы добавить к этому: переход на Lombok фактически позволил решить некоторые сложные ошибки в прошлом из-за несовпадения реализаций equals / hashCode и случаев, когда я забыл обновить созданные сейчас методы при добавлении поля. Эти потенциальные преимущества должны уравновесить большинство упомянутых вами недостатков. - person Tim; 04.10.2010

Ломбок отличный, но ...

Lombok нарушает правила обработки аннотаций, поскольку он не генерирует новые исходные файлы. Это означает, что его нельзя использовать с другими обработчиками аннотаций, если они ожидают, что существуют геттеры / сеттеры или что-то еще.

Обработка аннотаций выполняется в несколько циклов. В каждом раунде каждому дается очередь бежать. Если после завершения раунда обнаруживаются какие-либо новые файлы java, начинается другой раунд. Таким образом, порядок обработчиков аннотаций не имеет значения, если они только генерируют новые файлы. Поскольку lombok не генерирует никаких новых файлов, новые раунды не запускаются, поэтому некоторые AP, которые полагаются на код lombok, не работают должным образом. Это было для меня огромным источником боли при использовании mapstruct, и delombok-ing не является полезным вариантом, поскольку он уничтожает ваши номера строк в журналах.

В конце концов я взломал скрипт сборки, чтобы он работал как с ломбоком, так и с mapstruct. Но я хочу отказаться от ломбока из-за того, насколько он хакерский - по крайней мере, в этом проекте. Я постоянно использую ломбок в других вещах.

person twentylemon    schedule 24.07.2016

Я читал некоторые мнения о Ломбоке и на самом деле использую его в некоторых проектах.

Что ж, при первом контакте с Ломбоком у меня сложилось плохое впечатление. Через несколько недель он мне начал нравиться. Но через несколько месяцев я решаю множество мелких проблем с его использованием. Итак, мое последнее впечатление о Ломбоке не столь положительное.

Мои причины так думать:

  • Зависимость от подключаемого модуля IDE. Поддержка IDE для Lombok осуществляется через плагины. Даже работая нормально большую часть времени, вы всегда являетесь заложником этих подключаемых модулей, которые будут поддерживаться в будущих выпусках IDE и даже языковая версия (Java 10+ ускорит развитие языка). Например, я попытался обновить Intellij IDEA 2017.3 до 2018.1, и я не смог этого сделать, потому что была некоторая проблема с фактической версией плагина lombok, и мне нужно было дождаться обновления плагина ... Это также проблема, если вы хотел бы использовать более альтернативную среду IDE, в которой нет поддержки плагинов Lombok.
  • Проблема "Найти способы использования". Используя Lombok, вы не видите сгенерированные методы получения, установки, конструктора, построителя и т. Д. Итак, если вы планируете узнать, где эти методы используются в вашем проекте в вашей среде IDE, вы не можете сделать это, просто глядя для класса, которому принадлежат эти скрытые методы.
  • Настолько просто, что разработчикам не нужно нарушать инкапсуляцию. Я знаю, что это не проблема Ломбока. Но я заметил большую тенденцию разработчиков больше не контролировать, какие методы должны быть видимыми, а какие нет. Таким образом, часто они просто копируют и вставляют @Getter @Setter @Builder @AllArgsConstructor @NoArgsConstructor блок аннотаций, не задумываясь о том, какие методы действительно нужно предоставить классу.
  • Builder Obssession ©. Я придумал это имя (выходите, Мартин Фаулер). Помимо шуток, конструктор настолько прост в создании, что даже когда класс имеет только два параметра, разработчики предпочитают использовать @Builder вместо конструктора или метода статического конструктора. Иногда они даже пытаются создать Строителя внутри Ломбока Строителя, создавая странные ситуации вроде MyClass.builder().name("Name").build().create().
  • Барьеры при рефакторинге. Если вы используете, например, @AllArgsConstructor и вам нужно добавить еще один параметр в конструктор, IDE не сможет помочь вам добавить этот дополнительный параметр во все места (в основном, тесты), в которых создается экземпляр класса.
  • Смешивание Ломбока с конкретными методами. Вы не можете использовать Lombok во всех сценариях для создания получателя / сеттера и т. Д. Итак, вы увидите, что эти два подхода смешиваются в вашем коде. Через некоторое время к этому привыкаешь, но чувствуешь себя хакером с языком.

Как сказано в другом ответе, если вы недовольны многословием Java и используете Lombok, чтобы справиться с этим, попробуйте Kotlin.

person Dherik    schedule 23.03.2018
comment
Я бы сказал, переходите на Kotlin или оставайтесь на простой Java. Вы можете потратить больше времени на решение проблем с Lombok, чем сэкономите, не набирая java-код. - person jediz; 02.05.2018
comment
Тот, кто ненавидит Java только из-за многословности, виноват в том, что не сделал свой код менее многословным ... - person Nikolas Charalambidis; 05.02.2020

Также существуют риски, связанные с долгосрочным обслуживанием. Во-первых, я бы рекомендовал прочитать о том, как на самом деле работает Ломбок, например некоторые ответы его разработчиков здесь.

Официальный сайт также содержит список недостатков, включая эту цитату Райнира Цвитсерлоота:

Это полный взлом. Использование непубличного API. Самонадеянное приведение типов (зная, что обработчик аннотаций, работающий в javac, получит экземпляр JavacAnnotationProcessor, который является внутренней реализацией AnnotationProcessor (интерфейса), который, как оказалось, имеет пару дополнительных методов, которые используются для доступа к живому AST) .

В eclipse это, пожалуй, хуже (и еще более надежно) - java-агент используется для вставки кода в грамматику и класс парсера eclipse, что, конечно же, является полностью непубличным API и полностью запрещено.

Если бы вы могли делать то, что делает ломбок, со стандартным API, я бы сделал это таким же образом, но вы не можете. Тем не менее, чего бы он ни стоил, я разработал плагин eclipse для eclipse v3.5, работающий на java 1.6, и без каких-либо изменений он работал и на eclipse v3.4, работающем на java 1.5, так что он не полностью хрупкий.

В итоге, хотя Lombok может сэкономить вам время на разработку, если есть обновление javac, не имеющее обратной совместимости (например, смягчение уязвимости), Lombok может заставить вас застрять на старой версии Java, пока разработчики изо всех сил пытаются обновить свое использование тех внутренние API. Очевидно, серьезный ли это риск, зависит от проекта.

person dskrvk    schedule 02.06.2016
comment
Что ж, если вы больше не можете использовать Lombok, просто запустите delombok и продолжайте разработку без него. - person vladich; 17.02.2017
comment
Это все равно, что научиться водить машину в очках, а затем потерять их перед экзаменом по вождению. Если ваша команда привыкла работать с кодом Lombok и внезапно вынуждена изменить свой процесс из-за критического изменения, это окажет огромное влияние на текущие проекты. Не лучше ли вообще избежать этого риска и использовать фреймворк, который не полагается на недокументированные функции, или такой язык, как Scala, который предоставляет те же функции из коробки? - person dskrvk; 31.01.2018

Я знаю, что опаздываю, но не могу устоять перед искушением: всем, кому нравится Lombok, стоит взглянуть на Scala. Многие хорошие идеи, которые вы найдете в Lombok, являются частью языка Scala.

По вашему вопросу: определенно легче убедить ваших разработчиков попробовать Lombok, чем Scala. Попробуйте, и если он им понравится, попробуйте Scala.

Сразу оговорюсь: я тоже люблю Java!

person sorencito    schedule 16.08.2013
comment
Мне нравятся Scala и Lombok, но я не понимаю, о каких идеях вы говорите. \ @SneakyThrows, \ @Data, ...? - person sinuhepop; 29.08.2013
comment
@sinuhepop Генерация геттеров и сеттеров выглядит как классы случаев. Неизменяемая функция является неотъемлемой частью Scala, а расширенные API-интерфейсы для ваших собственных методов также являются встроенной функцией Scala. - person sorencito; 29.08.2013
comment
тоже попробуй Котлин - person jediz; 02.05.2018

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

person vici    schedule 02.07.2012
comment
Вы можете подробнее рассказать о головных болях? - person Kevin Welker; 10.09.2012
comment
Настройка Eclipse чрезвычайно проста. Просто java -jar lombok.jar. - person ; 16.04.2014
comment
Я думаю, что самая сложная часть настройки нового разработчика - это осознать, что вам нужно установить Lombok. Нет сообщения о том, что Lombok не был настроен или что-то в этом роде. Вместо этого вы получаете странные сообщения о том, что setFoo не определен. Если обучение на языке Lombok не является частью процесса обучения вашего нового разработчика на борту, возникнет серьезная путаница. - person Snekse; 09.07.2014
comment
@Snekse. Я точно не знаю, какая версия плагина lombok представила уведомление и предложение об идее intellij (в журнале ошибок появляется красное сообщение и предложение, чтобы побудить пользователя включить аннотацию и даже предоставить ссылку на раздел конфигурации), но Idea 2016.3 и версия плагина 0.13.16 содержит эту полезную поддержку. - person jtonic; 15.12.2016
comment
Плагин lombok idea (я использую версию 0.13.16) недавно представляет поддержку для уведомления пользователя о том, что процессор аннотаций не настроен, а также предоставляет ссылку на раздел настроек конфигурации, чтобы включить apt. См. Снимок экрана по адресу. postimg.org/image/5tm2zzvkh - person jtonic; 15.12.2016
comment
@jtonic Извините, я имею в виду в Eclipse. Я не использовал Eclipse или Lombok более двух лет, поэтому я даже не уверен, что это проблема. - person Snekse; 15.12.2016
comment
Настройка Lombok (такие Enable annotation processing могут быть задокументированы, поэтому новые разработчики не будут испытывать затруднений при присоединении к проекту. - person Leonid Dashko; 30.05.2020

Когда я показал проект своей команде, энтузиазм был на высоте, поэтому я думаю, не стоит бояться реакции команды.

  • Что касается рентабельности инвестиций, интеграция несложная и не требует изменения кода в его базовой форме. (просто добавив одну аннотацию к вашему классу)

  • И наконец, если вы передумаете, вы можете запустить unlombok или позволить вашей среде IDE создавать эти сеттеры, геттеры и ctors (которые, я думаю, никто не спросит, когда они увидят, насколько ясным становится ваше pojo)

person Dov Tsal S    schedule 02.09.2011

Я считаю, что Lombok просто предоставляет ярлыки для написания Java-кода с Bolilerplate.
Когда дело доходит до использования ярлыков для написания Java-кода с bolilerplate, я бы полагался на такие функции, предоставляемые IDE - как и в Eclipse, мы можем перейти к меню Источник> Создать геттеры и сеттеры для создания геттеров и сеттеров.
Я бы не стал полагаться на такую ​​библиотеку, как Lombok, для этого:

  1. Он загрязняет ваш код косвенным слоем альтернативного синтаксиса (прочтите аннотации @Getter, @Setter и т. Д.). Вместо того, чтобы изучать альтернативный синтаксис для Java, я бы переключился на любой другой язык, который изначально предоставляет Lombok-подобный синтаксис.
  2. Lombok требует использования IDE, поддерживаемой Lombok, для работы с вашим кодом. Эта зависимость представляет значительный риск для любого нетривиального проекта. Достаточно ли ресурсов у проекта Lombok с открытым исходным кодом для продолжения поддержки различных версий широкого спектра доступных Java IDE?
  3. Достаточно ли ресурсов у проекта Lombok с открытым исходным кодом для продолжения поддержки новых версий Java, которые появятся в будущем?
  4. Я также нервничаю, что Lombok может вызвать проблемы совместимости с широко используемыми фреймворками / библиотеками (например, Spring, Hibernate, Jackson, JUnit, Mockito), которые работают с вашим байтовым кодом во время выполнения.

В общем, я бы не стал «оживлять» свою Java с помощью Lombok.

person Sanjeev Sachdev    schedule 21.02.2018
comment
Один встречный аргумент: что, если бы кто-то использовал IDE для создания всех шаблонов POJO, но позже один из геттеров / сеттеров был переименован или удален. Класс больше не является строгим POJO, но это должно быть выведено из тщательного изучения всех методов класса. Я считаю, что аннотации ломбока по крайней мере избегают этого и делают бизнес-логику моих классов более заметной. Все ваши баллы действительны; однако просто хотел высказать эту мысль. И lombok развивает это с помощью @ Data / @ Value / @ Utility / @ Builder. - person Adam Hughes; 11.01.2019

Хотел использовать @ToString lombok, но вскоре столкнулся со случайными ошибками компиляции при перестроении проекта в Intellij IDEA. Пришлось несколько раз выполнить компиляцию, прежде чем инкрементная компиляция завершится успешно.

Пробовал lombok 1.12.2 и 0.9.3 с Intellij IDEA 12.1.6 и 13.0 без какого-либо плагина lombok под jdk 1.6.0_39 и 1.6.0_45.

Пришлось вручную скопировать сгенерированные методы из источника деломбок и отложить ломбок до лучших времен.

Обновить

Проблема возникает только при включенной параллельной компиляции.

Сообщил о проблеме: https://github.com/rzwitserloot/lombok/issues/648

Обновить

mplushnikov прокомментировал 30 января 2016 г .:

В более новой версии Intellij таких проблем больше нет. Думаю, здесь его можно закрыть.

Обновить

Я настоятельно рекомендую по возможности перейти с Java + Lombok на Kotlin. Поскольку он решил с нуля все проблемы с Java, которые Lombok пытается обойти.

person Vadzim    schedule 09.12.2013

У меня возникла проблема с Lombok и Jackson CSV, когда я упорядочил свой объект (компонент java) в файл CSV, столбцы были дублированы, а затем я удалил аннотацию @Data Lombok. и маршализация работала нормально.

person Gugelhupf    schedule 03.03.2016

Я не рекомендую это. Раньше я использовал его, но потом, когда я работал с NetBeans 7.4, мои коды были испорчены. Мне нужно удалить ломбок из всех файлов в моих проектах. Есть деломбок, но как я могу быть уверен, что он не прикрутит мои коды. Мне приходится тратить дни только на то, чтобы удалить ломбок и вернуться к обычным стилям Java. Я слишком острый ...

person Harun    schedule 28.02.2014
comment
Итак, что вы рекомендуете для аннотирования JavaBeans? - person IgorGanapolsky; 04.02.2015
comment
Команда ломбока обновила свой код. Тем не менее, мне нужно подождать несколько месяцев, прежде чем он будет готов. - person Harun; 31.07.2015

Я еще не пробовал использовать Lombok - он / был следующим в моем списке, но похоже, что Java 8 вызвала для него серьезные проблемы, а исправительные работы все еще продолжались по состоянию на неделю назад. Мой источник для этого - https://code.google.com/p/projectlombok/issues/detail?id=451.

person ChrisA    schedule 29.04.2014