Lombok是有害的 · Gregor Riegler


Java是一种非常冗长的语言,注释几乎可以解决任何问题。对吗? - 可是这是多么危险的组合。
我完全明白了。我也很懒,所以使用Lombok,但除了复制粘贴所有样板代码外,您是否考虑过影响?

魔术是有害的
我的代码中不需要任何魔法。这会使行为不透明。它会让您启动调试器,因为您实际上并不了解幕后发生的事情,而幕后不应该有什么事情。出于经济原因,一切都应该尽可能明确。

@ Data,@ Getter和@Setter是一种设计坏气味
当我设计我的领域对象时,我想避免外部直接访问,我希望这些对象代表一组完美封装数据的行为。我偶尔会在我的值对象Value Objects上有一些公共字段,但就只是这样了。为什么我要在这些对象上使用getters 或 setters?它们是应该通过特定方法修改数据的后门。这有点像Feature EnvyAnemic Domain Model贫血模型。

此外,setter违背了我想让大多数对象不可变的意图。毕竟,不可变对象更容易重构。

那么我在哪里需要setter/getter这样访问器?也许在我的数据传输对象DTO上?为什么我要将字段设为私有并在仅为这些数据创建setter/getter这样访问器?这种信息隐藏是否提供任何价值?对我来说,它只是杂乱无章。 直接使用public final字段在这里也许是一个更清洁的解决方案,比setter/getter这样访问器简单直接。我就是这样,不需要setter/getter这样访问器。

@AllArgsConstructor引入了位置的一致性问题
这个可怕的注释将字段的顺序与其生成的构造函数参数的顺序相结合。因此,当您重新排序字段时,您实际上会破坏您的代码。那是一个非常可靠的位置

双向对象关系导致堆栈溢出
因此,当您使用Lomboks equals,hashCode或toString实现时,双向关联将导致堆栈溢出是间接的。我并不是说双向关联是可取的,或者那些堆栈溢出并不明显。我要说的是,如果Lombok稍微聪明一些,它可能已经避免了那些。
坏事不是堆栈溢出。事实是它隐藏在注释背后。

Lombok插件将击中你的cpu
如果你不使用lombok插件,lombok会给你带来很多红色代码行。如果你确实使用了lombok插件,它会难为你的cpu。我所知道一个项目完成自动完成下拉时,在代码的特定区域加载15秒。这发生在i7处理器上,有大量的RAM和ssd。

Java版本大于8的兼容性问题
当我尝试将使用lombok的java 1.8项目迁移到java 11时,我遇到了问题。尽管我在互联网上发现了已知的问题修复,但我还是无法在尝试的2小时内再次使用它。Delombok来救援。
更新:好像我遇到了像类似的问题,要升级到Java 11。

如果lombok如此糟糕,还有什么选择?
我们可以回到显式的pojo代码。一些libs,ide功能和插件将帮助我们使用样板。

1. equals和hashcode
对于值对象,你想要包含所有字段,apache commons lang EqualsBuilderHashCodeBuilder派上用场。

@Override
public boolean equals(Object that) {
    return EqualsBuilder.reflectionEquals(this, that);
}
 
@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

甚至可以使用这样的intellij实时模板:

@Override
public boolean equals(Object that) {
    return org.apache.commons.lang3.builder.EqualsBuilder.reflectionEquals(this, that);
}

@Override
public int hashCode() {
    return org.apache.commons.lang3.builder.HashCodeBuilder.reflectionHashCode(this);
}

@ SLF4J
我建议再次使用intellij live模板。

// just put in 'className()' for the $CLASS$ variable
private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger($CLASS$.class);

@Builder
我非常喜欢intellij插件市场上免费提供的构建器生成插件。


此外,还有一个新的Replace Constructor,现在可以使用Builder重构。但是,我更喜欢Inner Builder插件。

Delombok案例
值得庆幸的是,有一个很棒的小功能叫做delombok。它会将你以前的所有lombok注释转换为他们在幕后创建的丑陋样板,因此你可以完全摆脱它。不要指望一个美好的结果,生成的代码将包含很多@SuppressWarnings("all")。此外,我的intellij插件的delombok功能导致我的ide堵塞。所以我不得不使用Lombok Maven插件,它工作得很好。