Просто начал использовать Lombok сегодня. Пока что мне это нравится, но один недостаток, который я не заметил, это рефакторинг поддержки.
Если у вас есть аннотированный класс @Data
, он сгенерирует для вас методы получения и установки на основе имен полей. Если вы используете один из этих методов получения в другом классе, а затем решите, что поле имеет неправильное имя, он не найдет использование этих методов получения и установки и заменит старое имя новым именем.
Я полагаю, что это должно быть сделано через плагин IDE, а не через Lombok.
ОБНОВЛЕНИЕ (22 января '13)
После трех месяцев использования Lombok я все еще рекомендую его для большинства проектов. Однако я обнаружил еще один недостаток, аналогичный указанному выше.
Если у вас есть класс, скажем MyCompoundObject.java
, у которого есть 2 члена, оба с аннотацией @Delegate
, скажем, myWidgets
и myGadgets
, когда вы звоните myCompoundObject.getThingies()
из другого класса, невозможно узнать, делегирует ли он класс Widget
или, Gadget
потому что вы больше не можете переходить к источнику в IDE.
Использование Eclipse «Generate Delegate Methods ...» предоставляет вам ту же функциональность, так же быстро и обеспечивает переход к исходному тексту. Недостатком является то, что он загромождает ваш исходный код стандартным кодом, который отвлекает внимание от важных вещей.
ОБНОВЛЕНИЕ 2 (26 февраля '13)
Через 5 месяцев мы все еще используем Lombok, но у меня есть некоторые другие неприятности. Отсутствие заявленного getter & setter может раздражать, когда вы пытаетесь ознакомиться с новым кодом.
Например, если я вижу вызываемый метод, getDynamicCols()
но я не знаю, о чем он, у меня есть несколько дополнительных препятствий для перехода, чтобы определить цель этого метода. Некоторые из препятствий - это Lombok, а некоторые - отсутствие умного плагина Lombok. Препятствия включают в себя:
- Отсутствие JavaDocs. Если я сделаю javadoc в поле, я надеюсь, что получатель и установщик унаследуют этот javadoc на этапе компиляции Lombok.
- Переход к определению метода возвращает меня к классу, но не к тому свойству, которое генерирует геттер. Это проблема с плагином.
- Очевидно, что вы не сможете установить точку останова в методе получения / установки, если вы не сгенерируете или не закодируете метод.
- ПРИМЕЧАНИЕ: этот поиск ссылок не является проблемой, как я сначала думал, что это было. Тем не менее, вам нужно использовать перспективу, которая включает представление Outline. Не проблема для большинства разработчиков. Моя проблема была в том, что я использовал Mylyn, который фильтровал мой
Outline
взгляд, поэтому я не видел методы. Отсутствие поиска литературы. Если я хочу узнать, кто звонит getDynamicCols(args...)
, я должен сгенерировать или закодировать установщик, чтобы иметь возможность искать ссылки.
ОБНОВЛЕНИЕ 3 (7 марта '13)
Я полагаю, научиться использовать различные способы ведения дел в Eclipse. На самом деле вы можете установить условную точку останова (BP) для метода, сгенерированного Lombok. Используя Outline
представление, вы можете щелкнуть правой кнопкой мыши на метод Toggle Method Breakpoint
. Затем, когда вы нажмете на BP, вы можете использовать представление отладки, Variables
чтобы увидеть, как сгенерированный метод назвал параметры (обычно совпадает с именем поля), и, наконец, использовать Breakpoints
представление, чтобы щелкнуть правой кнопкой мыши по BP и выбрать, Breakpoint Properties...
чтобы добавить условие. Ницца.
ОБНОВЛЕНИЕ 4 (16 августа '13)
Netbeans не нравится, когда вы обновляете свои зависимости Lombok в вашем Maven pom. Проект все еще компилируется, но файлы помечаются как имеющие ошибки компиляции, потому что он не может видеть методы, которые создает Lombok. Очистка кеша Netbeans решает проблему. Не уверен, есть ли опция «Чистый проект», как в Eclipse. Незначительная проблема, но хотел сделать это известным.
ОБНОВЛЕНИЕ 5 (17 января '14)
Ломбок не всегда хорошо играет с Groovy, или, по крайней мере, с groovy-eclipse-compiler
. Возможно, вам придется понизить вашу версию компилятора.
Maven Groovy и Java + Ломбок
ОБНОВЛЕНИЕ 6 (26 июня '14)
Слово предупреждения. Lombok немного затягивает, и если вы работаете над проектом, в котором по какой-то причине вы не можете его использовать, это вас раздражает. Возможно, вам будет лучше, если вы вообще никогда его не используете.
ОБНОВЛЕНИЕ 7 (23 июля '14)
Это немного интересное обновление, потому что оно напрямую касается безопасности принятия Lombok, о котором спрашивал OP.
Начиная с версии 1.14 @Delegate
аннотация переведена в экспериментальный статус. Подробности документированы на их сайте ( Документы для делегатов Lombok ).
Дело в том, что, если вы использовали эту функцию, ваши возможности возврата ограничены. Я вижу варианты как:
- Удалите
@Delegate
аннотации вручную и сгенерируйте / закодируйте код делегата. Это немного сложнее, если вы использовали атрибуты в аннотации.
- Деломбок файлы, которые имеют
@Delegate
аннотацию и, возможно, добавляют обратно в аннотации, которые вы хотите.
- Никогда не обновляйте Lombok и не поддерживайте форк (или используйте живые, используя экспериментальные функции).
- Деломбок весь ваш проект и перестаньте использовать Ломбок.
Насколько я могу судить, у Delombok нет возможности удалить подмножество аннотаций ; это все или ничего, по крайней мере, для контекста одного файла. Я открыл билет, чтобы запросить эту функцию с флагами Delombok, но я не ожидал, что в ближайшем будущем.
ОБНОВЛЕНИЕ 8 (20 октября '14)
Если это вариант для вас, Groovy предлагает большинство тех же преимуществ Lombok, а также множество других функций, включая @Delegate . Если вы думаете, что вам будет сложно продать идею властям, посмотрите на аннотацию @CompileStatic
или, @TypeChecked
чтобы понять, может ли это помочь вашему делу. На самом деле основной целью релиза Groovy 2.0 была статическая безопасность .
ОБНОВЛЕНИЕ 9 (1 сентября '15)
Ломбок все еще активно поддерживается и совершенствуется , что предвещает хороший уровень усыновления. В @Builder аннотации один из моих любимых новых возможностей.
ОБНОВЛЕНИЕ 10 (17 ноября '15)
Это может показаться не напрямую связанным с вопросом ОП, но стоит поделиться. Если вы ищете инструменты, которые помогут вам уменьшить объем стандартного кода, который вы пишете, вы также можете проверить Google Auto - в частности AutoValue . Если вы посмотрите на их слайд-колоду , перечислите Lombok как возможное решение проблемы, которую они пытаются решить. Минусы, которые они перечисляют для Lombok:
- Вставленный код невидим (вы не можете «увидеть» методы, которые он генерирует) [редактировать примечание - на самом деле вы можете, но это просто требует декомпилятора]
- Взломы компилятора нестандартны и хрупки
- «На наш взгляд, ваш код больше не является Java»
Я не уверен, насколько я согласен с их оценкой. И учитывая минусы AutoValue, которые описаны в слайдах, я буду придерживаться Lombok (если Groovy не вариант).
ОБНОВЛЕНИЕ 11 (февраль 8 '16)
Я узнал, что у Spring Roo есть некоторые подобные аннотации . Я был немного удивлен, обнаружив, что Roo все еще есть, а поиск документации для аннотаций немного грубоват. Удаление также выглядит не так просто, как де-ломбок. Ломбок кажется более безопасным выбором.
ОБНОВЛЕНИЕ 12 (17 февраля '16).
Пытаясь найти обоснование того, почему безопасно привезти Ломбок для проекта, над которым я сейчас работаю, я обнаружил кусок золота, который был добавлен с v1.14
- Система конфигурации ! Это означает, что вы можете настроить проект так, чтобы запретить определенные функции, которые ваша команда считает небезопасными или нежелательными. Более того, он также может создавать специфичные для каталога конфигурации с различными настройками. Это круто.
ОБНОВЛЕНИЕ 13 (4 октября '16)
Если подобные вещи важны для вас, Оливер Гирке счел безопасным добавить Lombok в Spring Data Rest .
ОБНОВЛЕНИЕ 14 (26 сентября 17 года).
Как отмечает @gavenkoa в комментариях к вопросу о OP, поддержка компилятора JDK9 пока недоступна (выпуск № 985). Похоже, что команде Ломбок будет нелегко обойтись.
ОБНОВЛЕНИЕ 15 (26 марта '18)
Журнал изменений Lombok указывает на v1.16.20 « Компиляция lombok на JDK1.9 теперь возможна », хотя # 985 все еще открыт.
Однако изменения в соответствии с JDK9 потребовали некоторых серьезных изменений; все изолированные для изменений в конфигурации по умолчанию. Немного по поводу того, что они внесли критические изменения, но версия только повысила «инкрементный» номер версии (переход от v1.16.18 к v1.16.20). Поскольку этот пост был о безопасности, если у вас была yarn/npm
похожая система сборки, которая автоматически обновлялась до последней инкрементной версии, вас могло бы ожидать грубое пробуждение.
ОБНОВЛЕНИЕ 16 (9 января '19)
Кажется, проблемы с JDK9 были решены , и, насколько я могу судить, Lombok работает с JDK10 и даже с JDK11.
Одна вещь, которую я заметил, хотя это касалось аспекта безопасности, это то, что журнал изменений, переходящий с v1.18.2 на v1.18.4, перечисляет два элемента как BREAKING CHANGE
!? Я не уверен, как происходит критическое изменение в обновлении "патча". Может быть проблема, если вы используете инструмент, который автоматически обновляет версии патча.
javac
, чтобы открыть доступ к внутреннимsun.*
классам ((