有没有办法在列表属性上自定义Lombok equalsAndHashCode()?
我有一个看起来像这样的子类:
public class subClass extends superClass {
private List<Long> ids;
对于 2 个子类对象,如果它们有 1 个或多个共同的 id,我认为它们是相等的。
我可以为其编写自己的逻辑,但是有没有办法在 Lombok 中自定义这个相等的逻辑?
我可以为其编写自己的逻辑,但是有没有办法在 Lombok 中自定义这个相等的逻辑?
有。但你不能做你想做的事。不是因为 lombok,而是因为 equals 和 hashCode 不允许你这样做。
有一个规则。如果 2 个对象相等,则它们的哈希码必须相等。 (反之则不一定成立;具有相等哈希码的 2 个对象不必相等)。
那么,您如何编写遵守此规则的 hashCode impl?唯一可行的选择是
return 0;
- subClass
的所有实例都具有相同的 hashCode。这消除了在许多你想要 equals
的上下文中尝试使用这样一个类的任何点,例如在 hashmap 中。这样做非常值得怀疑,但是你还有什么其他选择?
每当您重写方法(即实现由超类型定义的方法)时,您都必须遵守契约。这至少涉及签名行:您的覆盖必须具有相同的名称、参数类型和返回类型(或严格兼容的扩展),否则您未能遵守合同,编译器将如果你搞砸了,请拒绝编译。
但这并不是您必须遵守的唯一合同。
编译器不能检查所有内容。然而,仅仅因为编译器不检查并不意味着该规则不存在或者您可以忽略它。
如果不违反合同,你就不能这样做。
具体问题是等价规则。 equals 契约规定,实施必须遵守一系列规则。这里有问题的规则是这个:
如果
和a.equals(b)
,则b.equals(c)
必须 为真a.equals(c)
你不能那样做。
想象 A 的 id 为
[1,2,3]
,B 的 id 为 [2,3,4]
,C 的 id 为 [4,5,6]
。
在你的设置中,A 等于 B(因为它们有 2 和 3 的共同点),B 也等于 C(因为它们有 4 的共同点)。但 A 和 C 并不相等,因为它们没有共同的 ID,这违反了契约。