今天刚开始使用 Lombok。到目前为止,我喜欢它,但我没有看到提到的一个缺点是重构支持。
如果您有一个用 注释的类@Data
,它将根据字段名称为您生成 getter 和 setter。如果您在另一个类中使用其中一个 getter,然后确定该字段命名不当,它将找不到这些 getter 和 setter 的用法,并用新名称替换旧名称。
我想这必须通过 IDE 插件而不是通过 Lombok 来完成。
更新(2013 年 1 月 22 日)
在使用 Lombok 3 个月后,我仍然推荐它用于大多数项目。但是,我确实发现了另一个类似于上面列出的缺点。
如果你有一个类,假设它有 2 个成员,都用,say和MyCompoundObject.java
注释,当你从另一个类调用时,不可能知道它是委托给还是因为你不能再跳转到 IDE 中的源代码。@Delegate
myWidgets
myGadgets
myCompoundObject.getThingies()
Widget
Gadget
使用 Eclipse“生成委托方法...”为您提供相同的功能,同样快速并提供源代码跳转。不利的一面是它会使您的源代码与样板代码混淆,从而将注意力从重要的东西上移开。
更新 2(2013 年 2 月 26 日)
5 个月后,我们仍在使用 Lombok,但我还有其他一些烦恼。当您尝试熟悉新代码时,缺少已声明的 getter 和 setter 有时会很烦人。
例如,如果我看到一个被调用的方法,getDynamicCols()
但我不知道它是关于什么的,那么我有一些额外的障碍需要跳过来确定这个方法的用途。有些障碍是 Lombok,有些是缺少 Lombok 智能插件。障碍包括:
- 缺乏 JavaDocs。如果我对该字段进行 javadoc,我希望 getter 和 setter 将通过 Lombok 编译步骤继承该 javadoc。
- 跳转到方法定义会将我跳转到类,但不会跳转到生成 getter 的属性。这是一个插件问题。
- 显然,除非您生成或编码该方法,否则您无法在 getter/setter 中设置断点。
- 注意:此参考搜索不是我最初认为的问题。您确实需要使用启用大纲视图的透视图。对于大多数开发人员来说不是问题。我的问题是我正在使用过滤我的
Outline
视图的 Mylyn,所以我没有看到这些方法。 缺乏参考文献搜索。如果我想查看谁在调用getDynamicCols(args...)
,我必须生成或编码 setter 以便能够搜索引用。
更新 3(2013 年 3 月 7 日)
我猜想学习在 Eclipse 中使用各种做事方式。您实际上可以在 Lombok 生成的方法上设置条件断点 (BP)。使用Outline
视图,您可以右键单击方法来Toggle Method Breakpoint
. 然后当你点击BP时,你可以使用调试Variables
视图查看生成的方法命名参数(通常与字段名称相同),最后使用Breakpoints
视图右键单击BP并选择Breakpoint Properties...
添加条件。好的。
更新 4(2013 年 8 月 16 日)
当您在 Maven pom.xml 中更新 Lombok 依赖项时,Netbeans 不喜欢它。该项目仍在编译,但文件被标记为存在编译错误,因为它看不到 Lombok 正在创建的方法。清除 Netbeans 缓存可解决此问题。不确定是否有像 Eclipse 那样的“清理项目”选项。小问题,但想让它知道。
更新 5(2014 年 1 月 17 日)
Lombok 并不总是与 Groovy 配合得很好,或者至少groovy-eclipse-compiler
. 您可能必须降级编译器的版本。
Maven Groovy 和 Java + Lombok
更新 6(2014 年 6 月 26 日)
警告。Lombok 有点让人上瘾,如果你在一个项目中工作,由于某种原因你不能使用它,它会惹恼你。根本不使用它可能会更好。
更新 7(2014 年 7 月 23 日)
这是一个有趣的更新,因为它直接解决了 OP 询问的采用 Lombok的安全性。
从 v1.14 开始,@Delegate
注释已降级为实验状态。详细信息记录在他们的网站上(Lombok Delegate Docs)。
问题是,如果您使用此功能,您的退出选项是有限的。我将选项视为:
- 手动删除
@Delegate
注释并生成/手动编码委托代码。如果您在注释中使用属性,这会有点困难。
- Delombok 包含
@Delegate
注释的文件,并可能添加回您想要的注释。
- 永远不要更新 Lombok 或维护分叉(或使用体验功能)。
- Delombok 你的整个项目并停止使用 Lombok。
据我所知,Delombok 没有删除注释子集的选项;至少对于单个文件的上下文,它是全部或全部。我开了一张票,要求使用 Delombok 标志来请求此功能,但我不希望在不久的将来会出现这种情况。
更新 8(2014 年 10 月 20 日)
如果您愿意,Groovy 提供了 Lombok 的大部分相同优势,以及大量其他功能,包括@Delegate。如果您认为您很难将这个想法推销给当权者,请查看@CompileStatic
或@TypeChecked
注释,看看这是否有助于您的事业。事实上,Groovy 2.0 版本的主要焦点是静态安全。
更新 9(2015 年 9 月 1 日)
Lombok 仍在积极维护和增强,这预示着采用的安全级别。@Builder注释是我最喜欢的新功能之一。
更新 10(2015 年 11 月 17 日)
这似乎与 OP 的问题没有直接关系,但值得分享。如果您正在寻找工具来帮助您减少编写的样板代码量,您还可以查看Google Auto - 特别是AutoValue。如果您查看他们的幻灯片,将 Lombok 列为他们试图解决的问题的可能解决方案。他们为龙目岛列出的缺点是:
- 插入的代码是不可见的(你不能“看到”它生成的方法)[ed note - 实际上你可以,但它只需要一个反编译器]
- 编译器黑客是非标准且脆弱的
- “在我们看来,您的代码不再是真正的 Java”
我不确定我是否同意他们的评价。鉴于幻灯片中记录的 AutoValue 的缺点,我将坚持使用 Lombok(如果 Groovy 不是一个选项)。
更新 11(2016 年 2 月 8 日)
我发现Spring Roo有一些类似的注释。我有点惊讶地发现 Roo 仍然是一个东西,并且为注释查找文档有点粗糙。移除看起来也不像 de-lombok 那样容易。龙目岛似乎是更安全的选择。
更新 12(2016 年 2 月 17 日)
在尝试为我目前正在进行的项目引入 Lombok 的安全性提出理由时,我发现了一块添加了v1.14
-配置系统的黄金!这意味着您可以配置项目以禁止您的团队认为不安全或不受欢迎的某些功能。更好的是,它还可以创建具有不同设置的目录特定配置。这太棒了。
更新 13(2016 年 10 月 4 日)
如果这种事情对您很重要,Oliver Gierke认为将 Lombok 添加到 Spring Data Rest是安全的。
更新 14(2017 年 9 月 26 日)正如@gavenkoa在对 OPs 问题的评论中
所指出的, JDK9 编译器支持尚不可用(问题 #985)。听起来这对 Lombok 团队来说并不是一个容易解决的问题。
更新 15(2018 年 3 月 26 日)
Lombok 更改日志从 v1.16.20 开始显示“现在可以在 JDK1.9 上编译 lombok ”,即使#985仍处于打开状态。
然而,为适应 JDK9 所做的更改需要进行一些重大更改;所有这些都与配置默认值的更改隔离。他们引入了重大更改有点令人担忧,但该版本仅增加了“增量”版本号(从 v1.16.18 到 v1.16.20)。由于这篇文章是关于安全的,如果你有一个yarn/npm
类似的构建系统自动升级到最新的增量版本,你可能会被粗鲁地唤醒。
更新 16(2019 年 1 月 9 日)
据我所知,似乎JDK9 问题已经解决,Lombok 可以与 JDK10 甚至 JDK11 一起使用。
尽管从安全方面考虑,但我注意到的一件事是,从 v1.18.2 到 v1.18.4 的更改日志将两项列为BREAKING CHANGE
!? 我不确定在 semver“补丁”更新中如何发生重大变化。如果您使用自动更新补丁版本的工具,可能会出现问题。
更新 17(21 年 3 月 17 日)
Lombok 开发人员和 OpenJDK 开发人员之间围绕 JDK 16 发生了一些戏剧性 的事件。JDK 开发人员认为,Lombok 正在通过 JDK 团队希望关闭的漏洞利用未发布的 JDK 内部结构,但出于各种原因故意保持开放状态。
他们表达了他们的担忧(关于龙目岛的安全):
只要客户端应用程序明确允许,所有对内部的访问都将像以前一样保持可用,并承认它有意承担这可能带来的任何维护(或安全)问题。
虽然 Lombok 可能认为他们在欺骗 OpenJDK,但他们所做的只是宣布他们打算欺骗自己的用户。
很快就会有一天,Lombok 将无法围绕 JDK 的安全限制找到任何更具创造性的解决方案。即使他们这样做了,在您的项目中使用 Lombok 的安全性也可能存在问题。