2016-08-19 72 views
12

我非常喜欢摆脱样板代码的项目lombok的特性。 我的老人建议我,lombok似乎使用反射来减少样板代码,我曾经听说过使用反射效果的性能。 我的问题是有任何问题使用项目龙目岛?龙目岛能否降低业绩?

回答

19

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

6

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

@Data 
public class A { 
    private B b; 
} 

@Data 
public class B { 
    private A a; 
} 

龙目岛将创建带有无限递归的toString。你应该使用 类似@ToString(exclude = {"a"}) B类内

+3

正确,但请注意,这是非常正常的。 Java和Guava集合表现相同,“Arrays.toString(Object)”也如此。 lombok可以做的事情很少,因为它不会生成每个'toString'实现。 – maaartinus

+0

但我的样本中没有任何收藏。默认的toString结果看起来像“[email protected]”。所以没有递归。而且@Data lombok注释可能会造成方法“hashCode”和“equals”的低效实现。 PS 我很满意龙目岛,仍然推荐使用它 – sibnick

+0

好的,你没有收藏,但你可能有一些手写'toString'的对象。根据其实施情况,您需要排除一个字段或不。 Lombok可以通过在ThreadLocal 中记录其所有'toString'调用来处理它,但这会减慢所有调用的速度。这可能是一个有用的功能,但几乎没有人要求它。 +++为什么低效的'hashCode' /'equals'?因为他们以Java处理列表的方式处理数组? PS:我对Lombok非常满意(我认为它比Java 8更强大)。 – maaartinus