对带有继承的 @Data 注释 lombok 发出警告 equals/hashCode
Warning equals/hashCode on @Data annotation lombok with inheritance
我有一个继承自其他实体的实体。另一方面,我正在使用 lombok 项目来减少样板代码,所以我放置了 @Data
注释。带有继承的注解 @Data
产生下一个警告:
Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add @EqualsAndHashCode(callSuper=false)
to your type.
是否建议添加注释 @EqualsAndHashCode (callSuper = true)
或 @EqualsAndHashCode (callSuper = false)
?如果不加,那是callSuper=false
还是callSuper=true
?
@EqualsAndHashCode(callSuper=true)
应该可以解决警告。
default value 是 false
。如果您不指定它并忽略警告,这就是您得到的结果。
是的,建议在 @Data
注释的 class 上添加一个 @EqualsAndHashCode
注释,扩展对象以外的东西。我无法告诉您是否需要 true
或 false
,这取决于您的 class 层次结构,并且需要根据具体情况进行检查。
但是,对于项目或包,如果它不是 Object.class 的直接子class,您可以在 lombok.config
中配置以调用超级方法。
lombok.equalsAndHashCode.callSuper = call
有关支持的配置键,请参阅 configuration system documentation on how this works, and the @EqualsEndHashCode
documentation。
披露:我是 lombok 开发人员。
原题主要是:
Is it advisable to add annotation @EqualsAndHashCode (callSuper =
true) or @EqualsAndHashCode (callSuper = false)?
接受的答案基本上就是:
...that depends...
为了对此进行扩展,@EqualsAndHashCode 上的文档提供了一些可靠的选择指南。尤其是这个,恕我直言:
By setting callSuper to true, you can include the equals and hashCode
methods of your superclass in the generated methods. For hashCode, the
result of super.hashCode() is included in the hash algorithm, and
forequals, the generated method will return false if the super
implementation thinks it is not equal to the passed in object. Be
aware that not all equals implementations handle this situation
properly. However, lombok-generated equals implementations do handle
this situation properly, so you can safely call your superclass equals
if it, too, has a lombok-generated equals method.
要提炼一下:
如果您从没有状态信息的超类继承,或者它本身正在使用 @Data 注释,或者具有 "handle the situation properly" 的 equals/hash 的实现,请选择 'callSuper=true' - 我解释为返回状态值的适当散列。
如果你也想比较superclass的成员,那么使用@EqualsAndHashCode(callSuper=true)
。但是,如果您只想比较当前 class 中的字段,您可以使用 @EqualsAndHashCode(callSuper=false)
,这是 默认 选项。
如果你使用 Delombok-feature 你可以看到不同之处在于当设置为 true
时,这一行被添加到生成的 等于 方法if (!super.equals(o)) return false;
。如果在比较两个对象时应该考虑 superclass 中的成员,则必须将其设置为 true 才能正确比较。
我有一个继承自其他实体的实体。另一方面,我正在使用 lombok 项目来减少样板代码,所以我放置了 @Data
注释。带有继承的注解 @Data
产生下一个警告:
Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add
@EqualsAndHashCode(callSuper=false)
to your type.
是否建议添加注释 @EqualsAndHashCode (callSuper = true)
或 @EqualsAndHashCode (callSuper = false)
?如果不加,那是callSuper=false
还是callSuper=true
?
@EqualsAndHashCode(callSuper=true)
应该可以解决警告。
default value 是 false
。如果您不指定它并忽略警告,这就是您得到的结果。
是的,建议在 @Data
注释的 class 上添加一个 @EqualsAndHashCode
注释,扩展对象以外的东西。我无法告诉您是否需要 true
或 false
,这取决于您的 class 层次结构,并且需要根据具体情况进行检查。
但是,对于项目或包,如果它不是 Object.class 的直接子class,您可以在 lombok.config
中配置以调用超级方法。
lombok.equalsAndHashCode.callSuper = call
有关支持的配置键,请参阅 configuration system documentation on how this works, and the @EqualsEndHashCode
documentation。
披露:我是 lombok 开发人员。
原题主要是:
Is it advisable to add annotation @EqualsAndHashCode (callSuper = true) or @EqualsAndHashCode (callSuper = false)?
接受的答案基本上就是:
...that depends...
为了对此进行扩展,@EqualsAndHashCode 上的文档提供了一些可靠的选择指南。尤其是这个,恕我直言:
By setting callSuper to true, you can include the equals and hashCode methods of your superclass in the generated methods. For hashCode, the result of super.hashCode() is included in the hash algorithm, and forequals, the generated method will return false if the super implementation thinks it is not equal to the passed in object. Be aware that not all equals implementations handle this situation properly. However, lombok-generated equals implementations do handle this situation properly, so you can safely call your superclass equals if it, too, has a lombok-generated equals method.
要提炼一下: 如果您从没有状态信息的超类继承,或者它本身正在使用 @Data 注释,或者具有 "handle the situation properly" 的 equals/hash 的实现,请选择 'callSuper=true' - 我解释为返回状态值的适当散列。
如果你也想比较superclass的成员,那么使用@EqualsAndHashCode(callSuper=true)
。但是,如果您只想比较当前 class 中的字段,您可以使用 @EqualsAndHashCode(callSuper=false)
,这是 默认 选项。
如果你使用 Delombok-feature 你可以看到不同之处在于当设置为 true
时,这一行被添加到生成的 等于 方法if (!super.equals(o)) return false;
。如果在比较两个对象时应该考虑 superclass 中的成员,则必须将其设置为 true 才能正确比较。