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

问题描述 投票:0回答:5

我有一个继承自其他实体的实体。另一方面,我使用 Lombok 项目来减少样板代码,因此我添加了

@Data
注释。带有继承的注释
@Data
会产生下一个警告:

生成 equals/hashCode 实现,但不调用超类,即使此类不扩展 java.lang.Object。如果这是故意的,请将

@EqualsAndHashCode(callSuper=false)
添加到您的类型中。

我有以下问题:

  • 是否建议添加注释
    @EqualsAndHashCode(callSuper = true)
    @EqualsAndHashCode(callSuper = false)
  • 如果没有添加,是哪一个:
    callSuper=false
    callSuper=true
java lombok
5个回答
167
投票

默认值

false
。如果您不指定它并忽略警告,这就是您得到的结果。

是的,建议在

@EqualsAndHashCode
注释的类上添加
@Data
注释,这些类扩展了除 Object 之外的其他内容。我无法告诉您是否需要
true
false
,这取决于您的类层次结构,并且需要根据具体情况进行检查。

但是,对于项目或包,如果它不是 Object 的直接子类,则可以在

lombok.config
中配置以调用 super 方法。

lombok.equalsAndHashCode.callSuper = call

请参阅配置系统文档了解其工作原理,以及

@EqualsEndHashCode
文档了解支持的配置键。

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


67
投票

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


51
投票

主要的原始问题是:

是否建议添加注解@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”状态值的适当散列。


29
投票

如果您还想比较超类的成员,请使用

@EqualsAndHashCode(callSuper=true)
。但是,如果您只想比较当前类中的字段,则可以使用
@EqualsAndHashCode(callSuper=false)
,这是 default 选项。

如果您使用 Delombok 功能,您可以看到不同之处在于,当设置为

true
时,此行将添加到生成的 equals 方法
if (!super.equals(o)) return false;
中。如果在比较两个对象时应考虑超类中的成员,则必须将其设置为 true 才能正确比较。


0
投票

我认为 lombok

EqualsAndHashCode
即使没有继承也不一定有效。依赖 lombok 很危险,我感觉被背叛了

© www.soinside.com 2019 - 2024. All rights reserved.