Lombok会降低性能吗?

31

我非常喜欢项目Lombok中节省模板代码的功能。

我的前辈建议我使用lombok,但似乎它使用反射来减少样板代码,而我曾经听说使用反射会影响性能。

我的问题是使用项目Lombok是否存在任何问题?

2个回答

53

Lombok在运行时不使用反射。它钩入编译器内部,将代码添加到类中并在编译时进行编译。


7
既然这是我在搜索Project Lombok资源时看到的第一个答案,我想补充一点。你是正确的,它不会降低运行时性能,但在编译时存在性能缺陷。我们进行了测试,发现编译时间慢了2倍。如需更多信息,请参见此答案:https://dev59.com/i2_Xa4cB1Zd3GeqP6ONt - Barny
2
@ChristianKaiser 我不确定这是否真的算作一个“缺陷”,但是,确实需要分叉编译器会导致构建速度变慢。 - chrylis -cautiouslyoptimistic-
@Barny 如果你看了后续的内容,这已经不再是一个问题了。我也没有遇到过这个问题。 - gaborsch

12

@chrylis的回答是正确的,但要注意对象图(@Data@ToString注释)例如

@Data 
public class A {
   private B b;
}

@Data 
public class B {
   private A a;
}

Lombok会在内部创建无限递归的toString。你应该在类B内使用@ToString(exclude = {"a"})这样的东西。


5
没问题,但要注意这很正常。Java和Guava集合的表现也是如此,Arrays.toString(Object)也是如此。Lombok无法生成每个toString实现,因此它几乎无能为力。 - maaartinus
但是在我的示例中没有任何集合。默认的toString结果看起来像“my.package.A@35445”。所以没有递归。此外,@Data lombok注解也可能会创建“hashCode”和“equals”方法的低效实现。PS 我很喜欢lombok,仍然推荐使用它。 - sibnick
好的,你没有集合,但是你可能有一些手写的 toString 对象。根据它的实现,你需要排除一个字段或不排除。Lombok 可以通过在 ThreadLocal<IdentitySet> 中跟踪所有 toString 调用来处理它,但这会减慢所有调用的速度。这可能是一个有用的功能,但几乎没有人要求它。+++ 为什么 hashCode/equals 不高效?因为它们将数组视为 Java 中的列表?PS:我非常喜欢 Lombok(我认为它比 Java 8 的特性更好)。 - maaartinus
关于@Data中的hashCode。默认实现使用所有字段。这可能非常耗时,并使哈希码可变。当然,这是Java代码中的常见问题,但您在lombok代码中看不到这样的问题,因为问题被隐藏在您的眼前。您只需要记住这一点即可。 - sibnick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接