为什么龙目岛加罐等法

2022-09-04 22:39:53

使用龙目岛@Data时(添加 EqualsAndHashCode)

它添加方法canEqual

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

它只被调用一次:

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

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

如果你在非最终类中实现 equals 和 hashCode,我们能做的最安全的事情就是添加 can equal,就像我们所做的那样。由于我们不添加任何字段,因此成本非常小,特别是如果该方法受到保护。

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


答案 1

该方法在一篇题为“如何在Java中编写相等方法”的论文中定义。此方法旨在允许在类层次结构的多个级别上重新定义相等性,同时保留其协定:canEqual

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


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

龙目岛 0.10 中的新功能:除非你的类是扩展的,否则龙目岛会生成一个方法,这意味着JPA代理仍然可以等于它们的基类,但是添加新状态的子类不会破坏相等的契约。finaljava.lang.ObjectcanEqual

文档更进一步,引用了上面引用的论文:

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


答案 2

推荐