警告:@Data 注释 lombok 上的/hashCode 具有继承性

我有一个从别人那里继承来的实体。另一方面,我使用 Lombok 项目来减少样板代码,因此我将 @Data注释。带有继承性的注释 @Data产生下一个警告:

生成 equals/hashCode 实现,但不调用超类,即使这个类不扩展 java.lang。反对。如果是有意为之,请将 @EqualsAndHashCode(callSuper=false)添加到您的类型中。

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

94310 次浏览

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

默认值false。如果你没有指定它,并忽略警告,就会得到 false

是的,建议在 @Data注释类中添加一个 @EqualsAndHashCode注释,它扩展了 Object 以外的内容。我不能告诉您是否需要 truefalse,这取决于您的类层次结构,并且需要逐个进行检查。

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

lombok.equalsAndHashCode.callSuper = call

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

披露: 我是一个 Lombok 开发人员。

最初的主要问题是:

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

公认的答案基本上是:

那要看..。

为了进一步说明这一点,关于 @ EqualsAndHashCode的文档有一些可供选择的可靠指南,尤其是这一点,恕我直言:

通过将 callSuper 设置为 true,可以包括 equals 和 hashCode 对于 hashCode,在生成的方法中使用父类的 Hash 算法中包含 super.hashCode ()的结果,并且 如果超级 实现认为它不等于传入的对象 意识到并非所有等于实现都能处理这种情况 但是,lombok 生成的 equals 实现可以处理 这种情况下,所以你可以安全地调用你的超类等于 如果它也有一个 lombok 生成的 equals 方法。

把这个提炼一下: 如果您继承的超类没有状态信息,或者它本身使用@Data 注释,或者具有“正确处理情况”的 equals/hash 实现,那么选择‘ callSuper = true’——我将其解释为返回状态值的正确散列。

如果您也想比较超类的成员,那么使用 @EqualsAndHashCode(callSuper=true)。但是,如果只想比较当前类中的字段,可以使用 @EqualsAndHashCode(callSuper=false),它是 违约选项。

如果您使用 Delombok-功能,您可以看到不同的是,当设置为 true时,这一行被添加到生成的 等于方法 if (!super.equals(o)) return false;。如果超类中有成员,在比较两个对象时应该考虑这些成员,那么必须将它设置为 true 才能正确比较。