在@Data注释lombok上使用继承警告等于/ hashCode

时间:2016-07-25 16:04:42

标签: java lombok

我有一个继承自其他的实体。另一方面,我使用lombok项目来减少样板代码,所以我放了@Data注释。带继承的注释@Data会产生下一个警告:

  

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

建议添加注释@EqualsAndHashCode (callSuper = true)@EqualsAndHashCode (callSuper = false)吗?如果没有添加, callSuper=false callSuper=true 是哪一个?

4 个答案:

答案 0 :(得分:76)

default valuefalse。如果你没有指定它并忽略警告,那就是你得到的那个。

是的,建议在@EqualsAndHashCode带注释的类上添加@Data注释,这些类扩展了除Object之外的其他内容。我不能告诉您是否需要truefalse,这取决于您的班级层次结构,并且需要根据具体情况进行审核。

但是,对于项目或包,您可以在lombok.config中配置以调用超级方法(如果它不是Object的直接子类。)

lombok.equalsAndHashCode.callSuper = call

请参阅configuration system documentation有关其工作原理的信息,以及@EqualsEndHashCode documentation支持的配置密钥。

披露:我是一名lombok开发者。

答案 1 :(得分:28)

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

答案 2 :(得分:3)

最初的主要问题是:

  

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

可接受的答案基本上只是:

  

...这取决于...

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

  

通过将callSuper设置为true,可以包含equals和hashCode   生成的方法中您超类的方法。对于hashCode,   super.hashCode()的结果包含在哈希算法中,并且   等于,如果超级   实现认为它不等于传入的对象。是   意识到并非所有的平等实现都能处理这种情况   正确地。但是,lombok生成的equals实现确实可以处理   这种情况是正确的,所以您可以放心地将您的超类称为   如果也有lombok生成的equals方法。

将其简化一下: 如果您从没有状态信息的超类继承,或者本身正在使用@Data注释,或者具有等于/哈希的实现“可以正确处理情况”的实现,则选择“ callSuper = true”-我将其解释为意味着返回状态值的适当散列。

答案 3 :(得分:0)

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

如果使用 Delombok 功能,则可以看到的区别是,当设置为true时,此行将添加到生成的 equals 方法中{ {1}}。如果在比较两个对象时要考虑超类中的成员,则必须将其设置为true才能正确比较。