Java 带继承的@Data annotation lombok上的警告equals/hashCode
我有一个从其他实体继承的实体。另一方面,我使用lombok项目来减少样板代码,所以我将Java 带继承的@Data annotation lombok上的警告equals/hashCode,java,lombok,Java,Lombok,我有一个从其他实体继承的实体。另一方面,我使用lombok项目来减少样板代码,所以我将@Data注释。带有继承的注释@Data生成下一个警告: 生成equals/hashCode实现,但不调用超类,即使该类不扩展java.lang.Object。如果这是有意的,请将@EqualsAndHashCode(callSuper=false)添加到您的类型中 建议添加注释@EqualsAndHashCode(callSuper=true)或@EqualsAndHashCode(callSuper=fal
@Data
注释。带有继承的注释@Data
生成下一个警告:
生成equals/hashCode实现,但不调用超类,即使该类不扩展java.lang.Object。如果这是有意的,请将@EqualsAndHashCode(callSuper=false)
添加到您的类型中
建议添加注释@EqualsAndHashCode(callSuper=true)
或@EqualsAndHashCode(callSuper=false)
?如果未添加,它是callSuper=false
还是callSuper=true
?
应该解决该警告 是false
。如果不指定它并忽略警告,则会得到该警告
是的,建议在扩展对象以外的内容的@Data
注释类上添加@EqualsAndHashCode
注释。我无法告诉您是否需要true
或false
,这取决于您的类层次结构,需要逐个检查
但是,对于项目或包,如果它不是Object的直接子类,则可以在lombok.config
中配置调用超级方法
lombok.equalsAndHashCode.callSuper = call
请参阅有关其工作原理的,以及有关支持的配置密钥的
披露:我是lombok开发者。最初的主要问题是: 建议添加注释@EqualsAndHashCode(callSuper)吗= true)或@EqualsAndHashCode(callSuper=false) 公认的答案基本上是: …那要看情况了 为了进一步说明这一点,关于的文档提供了一些坚实的指导,供选择。特别是,IMHO: 通过将callSuper设置为true,可以包含equals和hashCode 生成的方法中的超类的方法。对于hashCode hash算法中包含super.hashCode()的结果,并且 对于forequals,如果 实现认为它不等于传入的对象。是 意识到并非所有equals实现都能处理这种情况 对。但是,lombok生成的equals实现无法处理 这种情况是正确的,因此您可以安全地调用您的超类equals 如果它也有lombok生成的equals方法 要将这一点降低一点:
如果您继承的超类没有状态信息,或者本身使用@Data注释,或者具有“正确处理情况”的equals/hash实现,则选择“callSuper=true”——我解释为返回状态值的正确hash 如果还想比较超类的成员,请使用
@EqualsAndHashCode(callSuper=true)
。但是,如果您只想比较当前类中的字段,则可以使用@EqualsAndHashCode(callSuper=false)
,这是默认的选项
如果使用Delombok功能,您可以看到不同之处在于,当设置为
true
时,如果(!super.equals(o))返回false,则该行将添加到生成的equals方法代码>。如果在比较两个对象时应考虑超类中的成员,则必须将其设置为true才能正确比较 为我工作。但是请记住,对于delombok插件来说,获取这个配置文件应该放在java源根目录中,而不是资源目录中,即src/main/java而不是src/main/resources@Roel我想知道为什么默认值是假的。我本以为会是相反的结果。另外,有没有一种等效的方法让toString()在默认情况下调用super?我看到我可以执行“@ToString(callSuper=true)”,但没有看到任何这样的配置设置。谢谢。如果我在@Data之前或之后添加@EqualsAndHashCode(callSuper=true)有关系吗?@AnnaKlein顺序不重要这应该是公认的答案,因为我认为Roel的建议不应该是“lombok.equalsandhascode.callSuper=call”,而应该为每个类做出决定。@AnnaKlein我不这么认为。事实上,这个答案应该是一个评论,这里没有新的信息,你可以在我的问题中找到。我确实知道@EqualsAndHashCode
解决了这个警告。事实上,根据公认的答案(以及下面我的答案),你应该在注释中选择“callSuper=true”或“callSuper=false”。我想这是一个很好地解释了如何在callSuper=false和callSuper=true之间进行选择的答案。我同意。这个解释真的很有帮助。