【问题标题】:Can lombok decrease performance?lombok会降低性能吗?
【发布时间】:2016-08-19 11:44:54
【问题描述】:

我真的很喜欢项目 lombok 摆脱样板代码的特性。 我的前辈建议我,lombok 似乎使用反射来减少样板代码,我曾经听说过使用反射效果性能。 我的问题是使用项目 lombok 有什么问题吗?

【问题讨论】:

    标签: java performance lombok


    【解决方案1】:

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

    【讨论】:

    • 由于这是第一个答案,所以我在搜索projectlombok资源时看到,我喜欢补充一点。你说的对。它不会在运行时降低性能,但在编译时存在性能缺陷。我们对其进行了测试,发现编译时间慢了 2 倍。更多信息请看这个答案:stackoverflow.com/questions/15518405/…
    • @ChristianKaiser 我不确定这是否真的是一个缺陷,但是是的,不得不分叉编译器确实会减慢构建速度。
    【解决方案2】:

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

    @Data 
    public class A {
       private B b;
    }
    
    @Data 
    public class B {
       private A a;
    }
    

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

    【讨论】:

    • 对,但请注意,这很正常。 Java 和 Guava 集合的行为相同,Arrays.toString(Object) 也是如此。 lombok 几乎没有什么可以做的,因为它不会生成每个 toString 实现。
    • 但我的样本中没有任何集合。默认 toString 结果看起来像“my.package.A@35445”。所以没有递归。此外,@Data lombok 注释也可能导致方法“hashCode”和“equals”的低效实现。 PS 我对 lombok 很满意,仍然推荐使用它
    • 好的,您没有收藏,但您可能有一些带有手写toString 的对象。根据其实现,您是否需要排除某个字段。 Lombok 可以通过在ThreadLocal<IdentitySet> 中跟踪其所有toString 调用来处理它,但这会减慢所有调用。它可能是一个有用的功能,但几乎没有人要求它。 +++ 为什么效率低下hashCode/equals?因为它们像 Java 对待列表一样对待数组? PS:我对 Lombok 非常满意(我认为它比 Java 8 的功能更强大)。
    • 关于hashCode for@Data。 hashCode 的默认实现使用所有字段。这可能非常耗时并且使哈希码可变。当然这是Java代码中常见的问题,但是在lombok代码中你看不到这样的问题,因为问题隐藏在你的眼睛之外。你应该记住这一点。
    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多