如果您不知道Project Lombok通过生成带有注释的getter和setter甚至使用@Data生成类似JavaBean的简单代码。它真的可以帮助我,特别是在50个不同的事件对象中,其中有多达7个不同的字段需要用getter构造和隐藏。我可以用这个删除将近一千行代码
然而,我担心,从长远来看,这将是一个令人遗憾的决定。当我提到Flamewars时,它将在##javafreenode频道中爆发,提供代码片段会让可能的帮助者感到困惑,人们会抱怨缺少JavaDoc,而未来的提交者可能会将其全部删除。我真的很喜欢积极的一面,但我担心消极的一面
所以:在任何项目上使用龙目山是否安全,无论是小项目还是大项目?积极的影响值得消极的影响吗
今天刚开始使用龙目。到目前为止,我很喜欢它,但有一个缺点我没有提到,那就是重构支持
如果您有一个用@Data注释的类,它将根据字段名为您生成getter和setter。如果您在另一个类中使用其中一个getter,然后确定该字段的名称不正确,那么它将找不到这些getter和setter的用法,并用新名称替换旧名称
我认为这必须通过IDE插件来完成,而不是通过Lombok
更新(2013年1月22日)
在使用Lombok 3个月后,我仍然推荐它用于大多数项目。然而,我确实发现了另一个类似于上面列出的缺点
如果你有一个类,比如说MyCompoundObject.java,它有两个成员,都用@Delegate注释,比如说myWidgets和myGadgets,当你从另一个类调用MyCompoundObject.getThingies()时,不可能知道它是委托给小部件还是小部件,因为您无法再跳转到IDE中的源代码
使用Eclipse“;生成委托方法…”;为您提供相同的功能,同样快速,并提供源代码跳转。缺点是,样板代码会使源代码变得杂乱无章,从而使重点从重要内容上转移
更新2(2013年2月26日)
5个月后,我们仍然使用Lombok,但我还有一些其他烦恼。缺少一个声明的getter&;当您试图熟悉新代码时,setter可能会变得烦人
例如,如果我看到一个名为getDynamicCols()的方法,但我不知道它是关于什么的,那么要确定这个方法的用途,我还有一些额外的障碍。有些障碍是Lombok,有些是缺少Lombok智能插件。障碍包括:
- 缺少JavaDocs。如果我在该字段中添加javadoc,我希望getter和setter能够通过Lombok编译步骤继承该javadoc
- 跳转到方法定义使我跳转到类,但不是生成getter的属性。这是一个插件问题
- 显然,除非生成或编写方法,否则无法在getter/setter中设置断点
- 注意:这个参考搜索并不像我最初认为的那样是一个问题。不过,您确实需要使用启用大纲视图的透视图。对于大多数开发人员来说,这不是问题。我的问题是我正在使用Mylyn过滤我的
大纲视图,所以我没有看到方法缺少引用搜索。如果我想知道谁在调用getDynamicCols(args…,我必须生成setter或对其编码,以便能够搜索引用
更新3(2013年3月7日)
我想,学习在Eclipse中使用各种各样的做事方式。实际上,您可以在Lombok生成的方法上设置条件断点(BP)。使用大纲视图,可以右键单击该方法以切换方法断点。然后,当您点击BP时,您可以使用debuggingVariables视图查看生成的方法将参数命名为什么(通常与字段名相同),最后,使用Breakpoints视图右键单击BP并选择Breakpoint Properties…添加条件。很好
更新4(2013年8月16日)
Netbeans不喜欢在Maven pom中更新Lombok依赖项。项目仍在编译,但文件会被标记为有编译错误,因为它看不到Lombok正在创建的方法。清除Netbeans缓存可以解决此问题。不确定是否有一个;清洁工程;选项,就像Eclipse中的选项一样。小问题,但想让大家知道
更新5(2014年1月17日)
Lombok并不总是很好地使用Groovy,或者至少使用Groovy eclipse编译器。您可能必须降级编译器的版本。
Maven Groovy和Java+Lombok
更新6(2014年6月26日)
一句警告的话。Lombok有点让人上瘾,如果你在一个项目中因为某种原因不能使用它,它会让你恼火。你最好不要使用它
更新7(2014年7月23日)
这是一个有趣的更新,因为它直接解决了OP询问的采用Lombok的安全问题
从v1.14开始,@Delegate注释已降级为实验状态。详细信息记录在他们的网站上(Lombok委托文件)
问题是,如果您使用此功能,您的退出选项是有限的。我认为有以下几种选择:
- 手动删除
@Delegate注释,并生成/手动编码委派代码。如果在注释中使用属性,这会稍微困难一些 - 删除包含
@Delegate注释的文件,并可能添加回您想要的注释中 - 永远不要更新Lombok或维护fork(或使用体验功能)
- 删除整个项目并停止使用Lombok
据我所知,Delombok没有删除注释子集的选项;至少对于单个文件的上下文而言,这是全部或全部。我打开了使用Delombok标志请求此功能的票证,但我不希望在不久的将来出现这种情况
更新8(2014年10月20日)
如果您可以选择,Groovy提供了与Lombok相同的大部分好处,还提供了大量其他功能,包括@Delegate。如果你认为你很难把这个想法推销给当权者,那么看看@CompileStatic或@TypeChecked注释,看看这是否有助于你的事业。事实上,Groovy 2.0发行版的主要焦点是静态安全
更新9(2015年9月1日)
龙目山是一座山