我有一个继承自其他实体的实体。另一方面,我使用 Lombok 项目来减少样板代码,因此我添加了
@Data
注释。带有继承的注释 @Data
会产生下一个警告:
生成 equals/hashCode 实现,但不调用超类,即使此类不扩展 java.lang.Object。如果这是故意的,请将
添加到您的类型中。@EqualsAndHashCode(callSuper=false)
我有以下问题:
@EqualsAndHashCode(callSuper = true)
或@EqualsAndHashCode(callSuper = false)
?callSuper=false
或
callSuper=true
?默认值是
false
。如果您不指定它并忽略警告,这就是您得到的结果。
是的,建议在
@EqualsAndHashCode
注释的类上添加 @Data
注释,这些类扩展了除 Object 之外的其他内容。我无法告诉您是否需要 true
或 false
,这取决于您的类层次结构,并且需要根据具体情况进行检查。
但是,对于项目或包,如果它不是 Object 的直接子类,则可以在
lombok.config
中配置以调用 super 方法。
lombok.equalsAndHashCode.callSuper = call
请参阅配置系统文档了解其工作原理,以及
@EqualsEndHashCode
文档了解支持的配置键。
披露:我是一名 lombok 开发者。
@EqualsAndHashCode(callSuper=true)
应该可以解决该警告。
主要的原始问题是:
是否建议添加注解@EqualsAndHashCode(callSuper = true)或@EqualsAndHashCode(callSuper = false)?
接受的答案基本上只是:
...这取决于...
为了扩展这一点,@EqualsAndHashCode 上的文档对如何选择提供了一些可靠的指导。尤其是这个,恕我直言:
通过将 callSuper 设置为 true,您可以包含 equals 和 hashCode 生成的方法中您的超类的方法。对于哈希码, super.hashCode() 的结果包含在哈希算法中,并且 forequals,生成的方法将返回 false,如果 super 实现认为它不等于传入的对象。是 意识到并非所有 equals 实现都能处理这种情况 适当地。然而,lombok 生成的 equals 实现确实可以处理 这种情况正确,所以你可以安全地调用你的超类 equals 如果它也有一个 lombok 生成的 equals 方法。
稍微提炼一下: 如果您从没有状态信息的超类继承,或者它本身使用 @Data 注释,或者具有“正确处理情况”的 equals/hash 实现(我将其解释为返回),请选择“callSuper=true”状态值的适当散列。
如果您还想比较超类的成员,请使用
@EqualsAndHashCode(callSuper=true)
。但是,如果您只想比较当前类中的字段,则可以使用 @EqualsAndHashCode(callSuper=false)
,这是 default 选项。
如果您使用 Delombok 功能,您可以看到不同之处在于,当设置为
true
时,此行将添加到生成的 equals 方法 if (!super.equals(o)) return false;
中。如果在比较两个对象时应考虑超类中的成员,则必须将其设置为 true 才能正确比较。
我认为 lombok
EqualsAndHashCode
即使没有继承也不一定有效。依赖 lombok 很危险,我感觉被背叛了