TL; DR:
是的,使用起来非常安全,我建议使用它。 (2022 年 5 月)
原答案
今天刚开始使用Lombok。到目前为止,我很喜欢它,但我没有看到提到的一个缺点是重构支持。
如果你有一个类注释为@Data
,它会根据字段名称为您生成 getter 和 setter。如果您在另一个类中使用这些 getter 之一,那么确定该字段的命名不当,它将找不到这些 getter 和 setter 的用法,并用新名称替换旧名称。
我想这必须通过 IDE 插件而不是通过 Lombok 来完成。
更新(2013 年 1 月 22 日)
使用 Lombok 3 个月后,我仍然推荐它用于大多数项目。然而,我确实发现了另一个与上面列出的类似的缺点。
如果你有课,请说MyCompoundObject.java
有 2 个成员,均注释为@Delegate
, say myWidgets
and myGadgets
, 你打电话时myCompoundObject.getThingies()
来自另一个类,不可能知道它是否委托给Widget
or Gadget
因为您无法再跳转到 IDE 中的源代码。
使用 Eclipse“生成委托方法...”为您提供相同的功能,速度同样快,并且提供源跳转。缺点是它会用样板代码扰乱您的源代码,从而使您无法集中精力关注重要的内容。
更新 2(2013 年 2 月 26 日)
5 个月后,我们仍在使用 Lombok,但我还有一些其他烦恼。当您试图熟悉新代码时,缺少声明的 getter 和 setter 有时会很烦人。
例如,如果我看到一个名为getDynamicCols()
但我不知道它是关于什么的,我有一些额外的障碍需要跨越才能确定这个方法的目的。有些障碍是 Lombok,有些是缺乏 Lombok 智能插件。障碍包括:
- 缺乏 JavaDocs。如果我对该字段进行 javadoc,我希望 getter 和 setter 能够通过 Lombok 编译步骤继承该 javadoc。
- 跳转到方法定义会将我跳转到类,但不会跳转到生成 getter 的属性。这是一个插件问题。
- 显然,除非生成或编写方法,否则无法在 getter/setter 中设置断点。
- 注意:此参考搜索并不像我最初认为的那样是一个问题。不过,您确实需要使用启用大纲视图的透视图。对于大多数开发人员来说这不是问题。我的问题是我正在使用 Mylyn,它正在过滤我的
Outline
view,所以我没有看到方法。缺乏参考文献搜索。如果我想看看谁打来的电话getDynamicCols(args...)
,我必须生成或编码设置器才能搜索引用。
更新 3(2013 年 3 月 7 日)
我想学习使用 Eclipse 中的各种做事方式。您实际上可以在 Lombok 生成的方法上设置条件断点 (BP)。使用Outline
查看方法,可以右键单击该方法Toggle Method Breakpoint
。然后打到BP的时候就可以使用调试了Variables
查看生成的方法命名的参数(通常与字段名称相同),最后使用Breakpoints
查看右键单击 BP 并选择Breakpoint Properties...
添加一个条件。好的。
更新 4(2013 年 8 月 16 日)
Netbeans 不喜欢您在 Maven pom 中更新 Lombok 依赖项。该项目仍然可以编译,但文件会被标记为存在编译错误,因为它看不到 Lombok 正在创建的方法。清除 Netbeans 缓存可以解决该问题。不确定是否有像 Eclipse 中那样的“Clean Project”选项。小问题,但想让大家知道。
更新 5(2014 年 1 月 17 日)
Lombok 并不总是能与 Groovy 很好地配合,或者至少groovy-eclipse-compiler
。您可能必须降级编译器的版本。Maven Groovy 和 Java + Lombok https://stackoverflow.com/questions/8524891/maven-groovy-and-java-lombok
更新 6(2014 年 6 月 26 日)
一句警告。 Lombok 有点容易让人上瘾,如果你从事的项目由于某种原因而无法使用它,它会让你恼火。您可能根本不使用它会更好。
更新 7(2014 年 7 月 23 日)
这是一个有趣的更新,因为它直接解决了safetyOP 询问的采用 Lombok 的问题。
从 v1.14 开始,@Delegate
注释已降级为实验状态。详细信息记录在他们的网站上(Lombok 代表文档 http://projectlombok.org/features/experimental/Delegate.html).
问题是,如果您使用此功能,您的撤销选项将受到限制。我看到的选项是:
- 手动删除
@Delegate
注释并生成/手动编码委托代码。如果您在注释中使用属性,这会有点困难。
- Delombok 具有以下内容的文件
@Delegate
注释,也许可以添加回您想要的注释。
- 切勿更新 Lombok 或维护分叉(或使用体验式功能)。
- Delombok 整个项目并停止使用 Lombok。
据我所知,Delombok 没有删除注释子集的选项 https://github.com/rzwitserloot/lombok/blob/master/src/delombok/lombok/delombok/Delombok.java;至少对于单个文件的上下文来说,要么全部要么全无。我打开了请求此功能的票证 https://code.google.com/p/projectlombok/issues/detail?id=711带有 Delombok 标志,但我不希望在不久的将来出现这种情况。
更新 8(2014 年 10 月 20 日)
如果您可以选择,Groovy 提供了 Lombok 的大部分相同优点,以及大量其他功能,包括@代表 http://groovy.codehaus.org/Delegate+transformation。如果您认为很难将这个想法推销给当权者,请查看@CompileStatic
or @TypeChecked
注释看看是否可以帮助您的事业。实际上,Groovy 2.0 版本的主要关注点是静态安全 http://docs.codehaus.org/display/GROOVY/Groovy+2.0+release+notes#Groovy2.0releasenotes-A%E2%80%9Cstatictheme%E2%80%9Dforadynamiclanguage.
更新 9(2015 年 9 月 1 日)
龙目岛仍处于积极维护和增强 https://projectlombok.org/changelog.html,这预示着采用的安全水平。这@Builder https://projectlombok.org/features/Builder.html注释是我最喜欢的新功能之一。
更新 10(2015 年 11 月 17 日)
这似乎与OP的问题没有直接关系,但值得分享。如果您正在寻找工具来帮助您减少编写的样板代码量,您还可以查看谷歌汽车 https://github.com/google/auto- 尤其自动值 https://github.com/google/auto/tree/master/value。如果你看看他们的幻灯片 https://docs.google.com/presentation/d/14u_h-lMn7f1rXE1nDiLX0azS3IkgjGl5uxp5jGJ75RE/edit#slide=id.g2a5e9c4a8_0104,将 Lombok 列为他们试图解决的问题的可能解决方案。他们列出的龙目岛缺点是:
- 插入的代码是不可见的(您无法“看到”它生成的方法)[编者注 - 实际上您可以,但它只需要一个反编译器]
- 编译器 hack 是非标准且脆弱的
- “在我们看来,你的代码不再是真正的 Java”
我不确定我在多大程度上同意他们的评价。鉴于幻灯片中记录的 AutoValue 的缺点,我将坚持使用 Lombok(如果 Groovy 不是一个选项)。
更新 11(2016 年 2 月 8 日)
我发现春罗 http://projects.spring.io/spring-roo/有一些相似的注释 https://stackoverflow.com/search?q=RooEquals。我有点惊讶地发现 Roo 仍然是一个东西,而且查找注释文档有点粗糙。移除看起来也不像 de-lombok 那么容易。龙目岛似乎是更安全的选择。
更新 12(2016 年 2 月 17 日)
在试图找出为什么在我目前正在进行的项目中引入 Lombok 是安全的理由时,我发现了一块金子,其中添加了v1.14
- The 配置系统 https://projectlombok.org/features/configuration.html!这意味着您可以配置项目以禁止您的团队认为不安全或不需要的某些功能。更好的是,它还可以使用不同的设置创建特定于目录的配置。这太棒了。
更新 13(2016 年 10 月 4 日)
如果这种事情对你来说很重要奥利弗·吉尔克 https://stackoverflow.com/users/18122/oliver-gierke觉得很安全将 Lombok 添加到 Spring Data Rest https://github.com/spring-projects/spring-data-rest/blame/897bc88d6922e755038a6a8e34ca25ace6a27689/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/alps/RootResourceInformationToAlpsDescriptorConverter.java#L20.
更新 14(2017 年 9 月 26 日)
正如所指出的@gavenkoa https://stackoverflow.com/users/173149/gavenkoa在对OP问题的评论中,JDK9 编译器支持尚不可用 https://github.com/rzwitserloot/lombok/issues/985(问题#985)。听起来这对 Lombok 团队来说也不是一个容易解决的问题。
更新 15(2018 年 3 月 26 日)
Lombok 变更日志显示自 v1.16.20 起“现在可以在 JDK1.9 上编译 lombok https://projectlombok.org/changelog“ 虽然#985 https://github.com/rzwitserloot/lombok/issues/985仍然开放。
然而,为了适应 JDK9,需要进行一些重大更改;所有这些都与配置默认值的更改无关。有点令人担忧的是,他们引入了重大更改,但该版本仅增加了“增量”版本号(从 v1.16.18 到 v1.16.20)。由于这篇文章是关于安全的,如果您有yarn/npm
就像自动升级到最新增量版本的构建系统一样,您可能会猛然醒悟。
更新 16(2019 年 1 月 9 日)
它似乎JDK9问题已经解决 https://projectlombok.org/changelog据我所知,Lombok 可以与 JDK10 配合使用,甚至可以与 JDK11 配合使用。
我注意到的一件事是,从安全方面来看,从 v1.18.2 到 v1.18.4 的更改日志列出了两项:BREAKING CHANGE
!?我不确定 semver“补丁”更新中如何发生重大变化。如果您使用自动更新补丁版本的工具,则可能会出现问题。
更新 17(2021 年 3 月 17 日)
Lombok 开发人员和 OpenJDK 开发人员之间围绕 JDK 16 发生了一些戏剧性的事情。JDK 开发者争论 https://github.com/rzwitserloot/lombok/issues/2681#issuecomment-791452056Lombok 正在通过 JDK 团队想要关闭的漏洞利用未发布的 JDK 内部结构,但由于各种原因故意保持开放状态。
(关于龙目岛的安全)如下:
所有对内部的访问都将像以前一样可用,前提是
客户端应用程序明确允许它,并承认它是
故意承担任何维护(或安全)问题,这可能
需要。
虽然 Lombok 可能认为他们在欺骗 OpenJDK,但他们所做的一切
宣布他们的意图是欺骗自己的用户。
可能很快有一天,Lombok 将无法针对 JDK 的安全限制找到任何更具创意的解决方案。即使他们这样做,在项目中使用 Lombok 的安全性也可能会受到质疑。
更新 18(2022 年 5 月 11 日)
最近的评论要求总结,所以我把它放在顶部。
简而言之,它使用起来非常安全,如果我们编写 Java 代码,我强烈建议使用它。
鉴于对 JDK 17 的支持已经取消了一段时间,并且在 JDK 正式发布后不到一个月就发布了,Lombok 的安全性很高。如果需要,您可以随时 de-lombok。
作为一名顾问,我了解许多不同的公司如何编写代码。过去 5 年我遇到的每个客户都使用过 Lombok。这些都是财富1000强公司。它加快了开发速度并减少了出错的可能性。
也就是说,您仍然需要了解 JDK 的最新功能。考虑使用Javarecord
关键字使您的对象不可变,而不是某些 Lombok 功能。在有意义的地方使用 Lombok。使用 Lombok 配置选项来防止以您不同意的方式使用它。
因此,除非发生重大事件,否则这可能是我对此答案的最后一次更新。感谢所有的投票。我很高兴它有帮助。