繁体   English   中英

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

[英]Warning equals/hashCode on @Data annotation lombok with inheritance

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

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

是否建议添加注释@EqualsAndHashCode (callSuper = true)@EqualsAndHashCode (callSuper = false) 如果没有添加,它是callSuper=false还是callSuper=true

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

是的,建议在@Data注释的类上添加一个@EqualsAndHashCode注释,这些类扩展了对象以外的其他内容。 我无法告诉您是否需要truefalse ,这取决于您的类层次结构,并且需要根据具体情况进行检查。

但是对于项目或者包,如果不是Object的直接子类,可以在lombok.config配置调用super方法。

lombok.equalsAndHashCode.callSuper = call

请参阅有关其工作原理的配置系统文档,以及有关支持的配置键的@EqualsEndHashCode文档

披露:我是龙目岛的开发人员。

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

主要的原始问题是:

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

接受的答案基本上只是:

……那要看……

为了扩展这一点, @EqualsAndHashCode上的文档有一些关于选择的可靠指导。 尤其是这一点,恕我直言:

通过将 callSuper 设置为 true,您可以在生成的方法中包含超类的 equals 和 hashCode 方法。 对于hashCode,super.hashCode()的结果包含在hash算法中,对于forequals,如果super实现认为它不等于传入的对象,则生成的方法将返回false。 请注意,并非所有 equals 实现都能正确处理这种情况。 但是,lombok 生成的 equals 实现确实可以正确处理这种情况,因此如果超类也有 lombok 生成的 equals 方法,您可以安全地调用它。

稍微提炼一下:如果您从没有状态信息的超类继承,或者本身正在使用@Data 注释,或者具有“正确处理情况”的 equals/hash 实现,请选择“callSuper=true” - 我认为这意味着返回状态值的正确散列。

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

如果您使用Delombok -feature,您可以看到不同之处在于,当设置为true时, if (!super.equals(o)) return false;将此行添加到生成的equals方法中if (!super.equals(o)) return false; . 如果在比较两个对象时应考虑超类中的成员,则必须将其设置为 true 才能正确比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM