使用lombok @数据时(它添加了EqualsAndHashCode)
它增加了canEqual
方法
受保护布尔canEqual(对象其他){返回其他实例的练习;}
它只被称为一次:
如果(!other.canEqual((对象)此)返回false;
我搜索并找到了关于访问级别的讨论
如果您在非最终类中实现了equals和hashCode,那么我们所能做的最安全的事情就是以相同的方式添加can。由于我们没有添加任何字段,所以成本很小,特别是在方法受到保护的情况下。
但是为什么我们需要这个生成的方法呢?它不能是内联的吗?
发布于 2019-10-07 05:32:57
canEqual
方法在一篇题为如何用Java编写相等方法的论文中定义。此方法的目的是允许在类层次结构的多个级别上重新定义相等,同时保留其契约:
其思想是,一旦类重新定义了
equals
(和hashCode
),它还应该明确声明该类的对象永远不等于实现不同相等方法的超类的对象。这是通过向每个重新定义canEqual
的类添加一个方法equals
来实现的。
它似乎是在Lombok0.10中引入的,正如@EqualsAndHashCode
文档中所描述的那样:
Lombok 0.10中的新类:除非您的类是
final
并扩展了java.lang.Object
,否则lombok将生成一个canEqual
方法,这意味着JPA代理仍然可以与它们的基类相等,但是添加新状态的子类不会破坏相等的契约。
这些文档更进一步,引用了上面引用的论文:
本文解释了为什么需要这样的方法的复杂原因:如何用Java编写相等方法。如果一个层次结构中的所有类都是scala案例类和带有lombok生成的equals方法的类的混合,那么所有的等式都将“只起作用”。如果需要编写自己的
equals
方法,则如果更改equals
和hashCode
,则应始终重写equals
。
https://stackoverflow.com/questions/58263870
复制相似问题