【发布时间】:2016-08-19 11:44:54
【问题描述】:
我真的很喜欢项目 lombok 摆脱样板代码的特性。 我的前辈建议我,lombok 似乎使用反射来减少样板代码,我曾经听说过使用反射效果性能。 我的问题是使用项目 lombok 有什么问题吗?
【问题讨论】:
标签: java performance lombok
我真的很喜欢项目 lombok 摆脱样板代码的特性。 我的前辈建议我,lombok 似乎使用反射来减少样板代码,我曾经听说过使用反射效果性能。 我的问题是使用项目 lombok 有什么问题吗?
【问题讨论】:
标签: java performance lombok
Lombok 在运行时不使用反射。它挂钩到编译器内部,并在编译时将代码添加到类中,然后正常编译。
【讨论】:
@chrylis 的答案是正确的,但要小心对象图(@Data 和 @ToString 注释),例如
@Data
public class A {
private B b;
}
@Data
public class B {
private A a;
}
Lombok 将创建内部无限递归的 toString。你应该使用
B类中的@ToString(exclude = {"a"})之类的东西
【讨论】:
Arrays.toString(Object) 也是如此。 lombok 几乎没有什么可以做的,因为它不会生成每个 toString 实现。
toString 的对象。根据其实现,您是否需要排除某个字段。 Lombok 可以通过在ThreadLocal<IdentitySet> 中跟踪其所有toString 调用来处理它,但这会减慢所有调用。它可能是一个有用的功能,但几乎没有人要求它。 +++ 为什么效率低下hashCode/equals?因为它们像 Java 对待列表一样对待数组? PS:我对 Lombok 非常满意(我认为它比 Java 8 的功能更强大)。
hashCode for@Data。 hashCode 的默认实现使用所有字段。这可能非常耗时并且使哈希码可变。当然这是Java代码中常见的问题,但是在lombok代码中你看不到这样的问题,因为问题隐藏在你的眼睛之外。你应该记住这一点。