gpt4 book ai didi

java - 在 Java 接口(interface)中处理 equals 和 hashCode 的微妙之处

转载 作者:行者123 更新时间:2023-12-04 05:29:26 24 4
gpt4 key购买 nike

我正在为这些接口(interface)实现一个值对象:

interface FooConsumer
{
public void setFoo(FooKey key, Foo foo);
public Foo getFoo(FooKey key);
}

// intent is for this to be a value object with equivalence based on
// name and serial number
interface FooKey
{
public String getName();
public int getSerialNumber();
}

从我读过的内容(例如在 Enforce "equals" in an interfacetoString(), equals(), and hashCode() in an interface 中)看来,建议是提供一个抽象基类,例如
abstract class AbstractFooKey
{
final private String name;
final private int serialNumber
public AbstractFooKey(String name, int serialNumber)
{
if (name == null)
throw new NullPointerException("name must not be null");
this.name = name;
this.serialNumber = serialNumber;
}
@Override public boolean equals(Object other)
{
if (other == this)
return true;
if (!(other instanceof FooKey))
return false;
return getName().equals(other.getName()
&& getSerialNumber() == other.getSerialNumber()
&& hashCode() == other.hashCode(); // ***
}
@Override public int hashCode()
{
return getName().hashCode() + getSerialNumber()*37;
}
}

我的问题是关于我在这里添加的最后一点,以及如何处理 AbstractFooKey.equals(x) 的情况使用 x 的值调用那是实现 FooKey 的类的实例但不子类 AbstractFooKey .我不知道如何处理这个;一方面,我觉得相等的语义应该只取决于 name 和 serialNumber 是否相等,但看起来 hashCodes 也必须相等才能满足 Object.equals() 的契约(Contract)。

我可以做:
  • 真的很松懈,忘记标记***的行
  • 松懈并保留我所拥有的
  • 返回 false来自 equals()如果 other对象不是 AbstractFooKey
  • 真的很严格并摆脱接口(interface) FooKey 并将其替换为最终类吗?
  • 别的东西?
  • 最佳答案

    将所需的语义记录为契约(Contract)的一部分。

    理想情况下,您实际上会有一个最终的实现,这否定了为此特定目的需要接口(interface)。您可能有其他原因需要该类型的接口(interface)。
    Object的契约(Contract)要求实际上是来自 hashCode : If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
    您不需要包含 hashCodeequals计算,而是需要包含 equals 中涉及的所有属性在 hashCode计算。在这种情况下,我会简单地比较 serialNumbername在这两个 equalshashCode .

    保持简单,除非你有真正的理由让它复杂化。

    从一个最终的、不可变的类开始。

    如果您需要一个接口(interface),请创建一个与之匹配的接口(interface),并记录语义和默认实现。

    关于java - 在 Java 接口(interface)中处理 equals 和 hashCode 的微妙之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12802872/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com