@Data注释Lombok上的警告equals / hashCode具有继承性


101

我有一个从其他继承的实体。另一方面,我正在使用lombok项目来减少样板代码,因此我添加了@Data注释。@Data具有继承的注释会产生下一个警告:

生成equals / hashCode实现,但不调用超类,即使该类未扩展java.lang.Object。如果这是故意的,请添加@EqualsAndHashCode(callSuper=false)您的类型。

是否建议添加注释@EqualsAndHashCode (callSuper = true)@EqualsAndHashCode (callSuper = false)?如果不加它,哪一个是它callSuper=false还是callSuper=true

Answers:


125

默认值false。如果您不指定它,而忽略警告,那就是您得到的。

是的,建议@EqualsAndHashCode在带@Data注释的类上添加注释,以扩展除Object之外的其他内容。我不能告诉您是否需要truefalse,这取决于您的类层次结构,并且需要逐案检查。

但是,对于项目或程序包,lombok.config如果它不是Object的直接子类,则可以配置为调用super方法。

lombok.equalsAndHashCode.callSuper = call

请参阅配置系统文档以了解其工作方式以及支持的配置密钥的@EqualsEndHashCode文档

披露:我是lombok开发人员。


为我工作。但是请记住,要让delombok插件选择此配置文件,应将其放置在java源根目录中,而不是在resources目录中,即src / main / java中,而不是src / main / resources中
user577736

1
@Roel我想知道为什么默认值为false。我原本会相反。另外,有没有一种等效的方法可以让toString()默认调用super?我看到我可以执行“ @ToString(callSuper = true)”,但是看不到任何此类配置设置。谢谢。
David Siegal '18

是否在@Data之前或之后添加@EqualsAndHashCode(callSuper = true)无关紧要?
安娜·克莱因

@AnnaKlein的顺序无关紧要
dan carter

46

@EqualsAndHashCode(callSuper=true) 应该解决警告。


1
这应该是正确的答案,因为我认为Roel的建议不应该“ lombok.equalsAndHashCode.callSuper = call”来完成,而是应该为每个类做出决定。
安娜·克莱因

4
@AnnaKlein我不这么认为。实际上,这个答案应该是评论,这里没有新信息,您可以在我的问题中找到。我确实知道@EqualsAndHashCode解决了该警告。
波城

实际上,根据所接受的答案(以及下面的我的答案),您应该在注释中的“ callSuper = true”或“ callSuper = false”之间进行选择。
亚当·怀斯

26

主要的原始问题是:

是否建议添加注释@EqualsAndHashCode(callSuper = true)或@EqualsAndHashCode(callSuper = false)?

可接受的答案基本上是:

...那要看...

为了对此进行扩展,@ EqualsAndHashCode的文档提供了一些可靠的选择指南。特别是,恕我直言:

通过将callSuper设置为true,可以在生成的方法中包括超类的equals和hashCode方法。对于hashCode,super.hashCode()的结果包含在哈希算法中,并且等于,如果super实现认为它与传入的对象不相等,则生成的方法将返回false。请注意,并非所有的equals实现都可以正确处理这种情况。但是,由lombok生成的equals实现确实可以正确处理这种情况,因此,如果它也具有由lombok生成的equals方法,则可以安全地调用您的超类equals。

稍微说明一下:如果您要继承的超类不包含状态信息,或者其本身正在使用@Data批注,或者具有可正确处理情况的equals / hash实现,请选择“ callSuper = true” -我的意思是返回状态值的正确哈希值。


我认为这是一个很好的解释,它解释了如何在callSuper = false和callSuper = true之间进行选择。
勇敢

9

如果您也想比较超类的成员,请使用@EqualsAndHashCode(callSuper=true)。但是,如果你只是想在当前类比较字段,你可以使用@EqualsAndHashCode(callSuper=false)它是默认选项。

如果您使用Delombok -feature,则可以看到的区别是,设置true为此行时,会将其添加到生成的equals方法中if (!super.equals(o)) return false;。如果在比较两个对象时要考虑超类中的成员,则必须将其设置为true才能正确比较。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.