Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带继承的@Data annotation lombok上的警告equals/hashCode_Java_Lombok - Fatal编程技术网

Java 带继承的@Data annotation lombok上的警告equals/hashCode

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

我有一个从其他实体继承的实体。另一方面,我使用lombok项目来减少样板代码,所以我将
@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之间进行选择的答案。我同意。这个解释真的很有帮助。