gpt4 book ai didi

java - 重写正确的 Java equals 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:39 25 4
gpt4 key购买 nike

我正在覆盖 Java 类中的 equals() 方法,发现一个我无法解释的难题。

标准的 equals() 契约规定:

  • 它是自反的:对于任何引用值 x,x.equals(x) 应该返回 true。
  • 它是对称的:对于任何引用值 x 和 y,x.equals(y) 应该返回 true 当且仅当 y.equals(x) 返回 true。
  • 它是传递性的:对于任何引用值 x、y 和 z,如果 x.equals(y) 返回 true 而 y.equals(z) 返回 true,则 x.equals(z) 应该返回 true。<
  • 它是一致的:对于任何引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是在对象的 equals 比较中使用的信息没有被修改。
  • 对于任何非空引用值 x,x.equals(null) 应该返回 false。

因此,标准的 equals() 方法应该像这样构造:

public boolean equals(Object other) {
if (null == other) return false;
if (this == other) return true;
if (!(other instanceof MyClassName)) return false;
MyClassName that = (MyClassName) other;
return this.myMemberVariable.equals(that.name);
}

给定类 Foo 和类 Bar extends Foo,它们都有一个成员变量 String baz,标准的 equals() Foo 中的 方法如下所示:

public boolean equals(Object other) {
if (null == other) return false;
if (this == other) return true;
if (!(other instanceof Foo)) return false;
Foo that = (Foo) other;
return this.baz.equals(that.name);
}

Bar 中的标准 equals() 方法如下所示:

public boolean equals(Object other) {
if (null == other) return false;
if (this == other) return true;
if (!(other instanceof Bar)) return false;
Barthat = (Bar) other;
return this.baz.equals(that.name);
}

如果我有对象 Foo foo = new Foo("Test");Bar bar = new Bar("Test");,我调用了 foo.equals(bar),这将返回 true。如果我通过 equals() 契约的对称子句调用 bar.equals(foo),这将被破坏,因为在 equals() 内部Bar(!(other instanceof Bar))true,使 Bar 相等() 方法返回 false,这是不正确的,按逻辑应该是 true(两个对象 String baz 都是彼此相等),并且通过对称子句,如果 x.equals(y)y.equals(x) 本质上是 true.

我知道 getClass()instanceof 参数重写 equals() 并且不想要另一个参数。

这让我想到了我的实际问题。在这种情况下,如何正确地覆盖遵循标准 Java 平等协定的 equals() 方法?

最佳答案

根据你的问题

  • Foo 可以等于 Bar 如果它们有相同的 baz
  • Foo 可以等于 Foo 如果它们有相同的 baz
  • Bar 可以等于 Bar 如果它们有相同的 baz

这清楚地表明 FooBar 将具有 完全相同的 equals() 实现。因此,您根本不应覆盖它。

如果您试图忽略它并无论如何覆盖它,您将得出一个明显的结论:您不能将 Bar 向下转换为 Foo,但是您可以将两个参数都转换为Bar。一旦这样做,您就会意识到您可以简单地使用 Bar 中的 .equals()

关于java - 重写正确的 Java equals 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22053172/

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