在列表属性上自定义 Lombok equalsAndHashCode()

问题描述 投票:0回答:1

有没有办法在列表属性上自定义Lombok equalsAndHashCode()?

我有一个看起来像这样的子类:

public class subClass extends superClass {
    private List<Long> ids;

对于 2 个子类对象,如果它们有 1 个或多个共同的 id,我认为它们是相等的。

我可以为其编写自己的逻辑,但是有没有办法在 Lombok 中自定义这个相等的逻辑?

java inheritance arraylist equals lombok
1个回答
0
投票

我可以为其编写自己的逻辑,但是有没有办法在 Lombok 中自定义这个相等的逻辑?

有。但你不能做你想做的事。不是因为 lombok,而是因为 equals 和 hashCode 不允许你这样做

问题1:哈希码

有一个规则。如果 2 个对象相等,则它们的哈希码必须相等。 (反之则不一定成立;具有相等哈希码的 2 个对象不必相等)。

那么,您如何编写遵守此规则的 hashCode impl?唯一可行的选择是

return 0;
-
subClass
的所有实例都具有相同的 hashCode。这消除了在许多你想要
equals
的上下文中尝试使用这样一个类的任何点,例如在 hashmap 中。这样做非常值得怀疑,但是你还有什么其他选择?

问题2:等价规则

每当您重写方法(即实现由超类型定义的方法)时,您都必须遵守契约。这至少涉及签名行:您的覆盖必须具有相同的名称、参数类型和返回类型(或严格兼容的扩展),否则您未能遵守合同,编译器将如果你搞砸了,请拒绝编译。

但这并不是您必须遵守的唯一合同

编译器不能检查所有内容。然而,仅仅因为编译器不检查并不意味着该规则不存在或者您可以忽略它。

如果不违反合同,你就不能这样做

具体问题是等价规则。 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,这违反了契约

© www.soinside.com 2019 - 2024. All rights reserved.