当前位置: 首页 > 知识库问答 >
问题:

为什么龙目山加入canEqual方法

秦景同
2023-03-14

使用lombok@Data时(添加了EqualsAndHashCode)

它添加了canEqual方法

protected boolean canEqual(Object other) {
  return other instanceof Exercise;
}

它只被称为一次:

if (!other.canEqual((Object)this)) return false;

我搜索并找到了关于访问级别的讨论

如果您在非最终类中实现equals和hashCode,我们能做的最安全的事情就是像我们这样添加can等于。因为我们不添加任何字段,所以成本很低,尤其是如果方法受到保护的话。

但是为什么我们需要这个生成的方法呢?它不能是内联的吗?

共有1个答案

傅树
2023-03-14

canEqual方法是在一篇题为《如何用Java编写相等方法》的论文中定义的。此方法旨在允许在保持其契约的同时,在类层次结构的多个级别上重新定义相等:

这个想法是,一旦一个类重新定义了equals(和hashCode),它还应该明确声明这个类的对象永远不等于实现不同等式方法的某个超类的对象。这是通过向每个重新定义等于的类添加一个方法来实现的。

它似乎是在Lombok 0.10中引入的,如@EqualsAndHashCode文档中所述:

Lombok 0.10中新增:除非您的类是final并扩展java。lang.Object,lombok生成一个canEqual方法,这意味着JPA代理仍然可以与其基类相等,但添加新状态的子类不会破坏equals契约。

文件更进一步,参考了上面引用的论文:

本文解释了为什么需要这种方法的复杂原因:如何在Java中编写等式方法。如果层次结构中的所有类都是scala case类和具有lombok生成的equals方法的类的混合,那么所有的等式都将“正常工作”。如果您需要编写自己的equals方法,如果您更改了equalshashCode,则应始终重写canEquals

 类似资料:
  • 问题内容: 怪异的 (可能一点也不奇怪) 我有3个对象,即Employee,Rota和Department。 并不复杂,真的。Rota可以分配一个员工和/或部门,所有这些都使用Fluent进行配置。我所有的关联都是正确的(架构是完美的),但是我有一个奇怪的怪异之处。 当我执行并查看生成的SQL时,在Employee&Rota上有一个 LEFT OUTER JOIN 。为什么在那儿? 我不希望它这样

  • 我最近升级到了新的Eclipse版本(Oxygen)。我下载了龙目山。jar从网站上下载并安装了它。这就是

  • 我试图在带有Java8的Maven项目中使用Lombok,但是当我应用@Data注释时,Lombok不会生成任何Getters和Setters。我尝试使用这里提到的Maven编译器插件版本3.5,但没有帮助。有人知道我需要使用哪些版本吗? pom.xml

  • 本文向大家介绍什么是爬山法(Hill Climbing)?相关面试题,主要包含被问及什么是爬山法(Hill Climbing)?时的应答技巧和注意事项,需要的朋友参考一下 DFS的变形,不同的是每次选择的是最优的一个子结点,即局部最优解 例如,对于8数码问题,设置一个函数表示放错位置的数目,每次选择子结点中放错最少的结点 步骤: 1.建立一个栈,将根结点放入栈 2.判断栈顶元素是否是目标结点,如果

  • 我想在我的类中使用lombok+@slf4j添加一个额外的记录器。当前,我正在使用@slf4j,它创建 私有静态最终org.slf4j.logger log=org.slf4j.loggerFactory.getLogger(logExample.class)。 我正在使用这个标准日志记录,我想创建另一个日志记录程序在类中的特定日志记录。 若要将特定日志输出到单独的文件,请执行以下操作。这是手动操

  • 我在gradle项目中使用lombok,希望创建一个jar文件,但每次我执行jar任务(无论是在控制台还是eclipse ide中触发)时,我都会发现错误,我的lombok导入在我使用lombok注释的类中找不到。输出示例: 搜索了一段时间后,我发现有一个适用于gradle和lombok的插件,但在使用较新的gradle版本编译时并不真正需要。我的gradle版本是3.4.1和lombok 1.6