我有一个继承自其他的实体。另一方面,我使用lombok项目来减少样板代码,所以我放了@Data
注释。带继承的注释@Data
会产生下一个警告:
生成equals / hashCode实现但不调用超类,即使此类不扩展java.lang.Object。如果这是故意的,请将
@EqualsAndHashCode(callSuper=false)
添加到您的类型中。
建议添加注释@EqualsAndHashCode (callSuper = true)
或@EqualsAndHashCode (callSuper = false)
吗?如果没有添加, callSuper=false
或 callSuper=true
是哪一个?
答案 0 :(得分:76)
default value为false
。如果你没有指定它并忽略警告,那就是你得到的那个。
是的,建议在@EqualsAndHashCode
带注释的类上添加@Data
注释,这些类扩展了除Object之外的其他内容。我不能告诉您是否需要true
或false
,这取决于您的班级层次结构,并且需要根据具体情况进行审核。
但是,对于项目或包,您可以在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才能正确比较。