我非常喜欢项目Lombok中节省模板代码的功能。
我的前辈建议我使用lombok,但似乎它使用反射来减少样板代码,而我曾经听说使用反射会影响性能。
我的问题是使用项目Lombok是否存在任何问题?
我非常喜欢项目Lombok中节省模板代码的功能。
我的前辈建议我使用lombok,但似乎它使用反射来减少样板代码,而我曾经听说使用反射会影响性能。
我的问题是使用项目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
实现,因此它几乎无能为力。 - maaartinustoString
对象。根据它的实现,你需要排除一个字段或不排除。Lombok 可以通过在 ThreadLocal<IdentitySet>
中跟踪所有 toString
调用来处理它,但这会减慢所有调用的速度。这可能是一个有用的功能,但几乎没有人要求它。+++ 为什么 hashCode
/equals
不高效?因为它们将数组视为 Java 中的列表?PS:我非常喜欢 Lombok(我认为它比 Java 8 的特性更好)。 - maaartinus@Data
中的hashCode
。默认实现使用所有字段。这可能非常耗时,并使哈希码可变。当然,这是Java代码中的常见问题,但您在lombok代码中看不到这样的问题,因为问题被隐藏在您的眼前。您只需要记住这一点即可。 - sibnick