如果你不知道,Project Lombok帮助解决了Java的一些麻烦,比如用注释生成getter和setter,甚至是简单的JavaBean,比如用@Data生成。它真的可以帮助我,特别是在50个不同的事件对象中,你有多达7个不同的字段需要用getter来构造和隐藏。我可以用这个删除几乎一千行代码。

然而,我担心从长远来看,这将是一个后悔的决定。当我提到它的时候,火焰战争就会在##Java Freenode频道爆发,提供代码片段会让可能的助手感到困惑,人们会抱怨缺少JavaDoc,而未来的提交者可能无论如何都会删除它。我很享受积极的一面,但我担心消极的一面。

那么:在任何项目中使用Lombok安全吗?积极的影响抵得上消极的影响吗?


当前回答

我还没有尝试使用Lombok -它是/是我清单上的下一个,但听起来Java 8给它带来了很大的问题,补救工作在一周前仍在进行中。我的来源是https://code.google.com/p/projectlombok/issues/detail?id=451。

其他回答

继续使用Lombok吧,如果有必要,您可以在之后“delombok”您的代码http://projectlombok.org/features/delombok.html

我个人(因此也是主观上)发现,与IDE/自己实现的复杂方法(如hashcode & equals)相比,使用Lombok使我的代码更能表达我想要实现的目标。

当使用

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

与任何IDE/自己的实现相比,保持Equals & HashCode一致并跟踪哪些字段被求值要容易得多。当您仍然定期添加/删除字段时,这一点尤其正确。

@ToString注释及其参数也是如此,它们清楚地传达了所期望的行为,包括包含/排除字段、getter的使用或字段访问,以及是否调用super.toString()。

同样,通过使用@Getter或@Setter(AccessLevel.NONE)注释整个类(并可选择覆盖任何发散的方法),可以立即清楚哪些方法将可用于字段。

好处无穷无尽。

在我看来,这不是关于减少代码,而是关于清楚地传达您想要实现的目标,而不是必须从Javadoc或实现中找到答案。减少的代码只是使它更容易发现任何发散方法实现。

龙目岛很棒,但是……

Lombok打破了注释处理的规则,因为它不生成新的源文件。这意味着它不能与其他注释处理器一起使用,如果它们期望getter /setter或其他任何存在的东西。

Annotation processing runs in a series of rounds. In each round, each one gets a turn to run. If any new java files are found after the round is completed, another round begins. In this way, the order of annotation processors doesn't matter if they only generate new files. Since lombok doesn't generate any new files, no new rounds are started so some AP that relies on lombok code don't run as expected. This was a huge source of pain for me while using mapstruct, and delombok-ing isn't a useful option since it destroys your line numbers in logs.

我最终破解了一个构建脚本,可以同时使用lombok和mapstruct。但我想放弃龙目岛,因为它太粗糙了——至少在这个项目中是这样。我一直在用龙目岛做其他东西。 更新到mapstruct+lombok:这两个库现在可以开箱即用。不过,对于其他注释处理器来说,这个问题仍然存在。

在过去的一年里,我在几乎所有的项目中都使用了Lombok,但不幸的是,我把它移除了。在一开始,这是一种非常干净的开发方式,但为新团队成员设置开发环境并不是非常容易和直接的。头痛时,我就把它去掉了。但这是一个很好的工作,需要一些更简单的设置。

我遇到了Lombok和Jackson CSV的问题,当我将我的对象(java bean)编组到CSV文件时,其中的列重复,然后我删除了Lombok的@Data注释,编组工作正常。