8

equals()親クラスと子クラスの両方で実装する場合、子クラスでhashCode()呼び出す必要がありますか?super.equals()equals()

public boolean equals(Object obj) {

  if (obj.getClass() != ChildClass.class) {
    return false;
  }

  return super.equals() && this.var == ((ChildClass) obj).var;

}

親クラスは Object ではなく、equals と hashCode の正しい定義を与えていると想定しています。

4

2 に答える 2

8

No, that's not necessary, and would probably be wrong. Indeed, part of the reason why you're overriding equal is because super.equals doesn't give the correct behaviour (right?).

Or put another way, if super.equals gives the correct behaviour, you probably don't need to go to the trouble of overriding it.

But if you are overriding equals, then yes, you need to override hashCode, too.

于 2012-04-20T21:26:59.557 に答える
2

スーパー クラスが equals を実装していない場合、super.equals を呼び出すと、参照のみを比較する Object 実装が取得されます。そのため、ビジネス キーを比較する通常の equals 実装では、実際には多くの偽陰性が発生します。

つまり、上記の実装は==、比較のために使用しているだけなので、 Object のデフォルトの equals 実装と意味的に違いはありません。

hashCode に関しては、equals をオーバーライドする場合、2 つのコントラクトを維持するために hashCode をオーバーライドする必要があります。たとえば、equals にビジネス キーを使用している場合は、おそらくハッシュコードに同じビジネス キーを使用して、等しい 2 つのオブジェクトが同じハッシュコードを生成するようにする必要があります。

于 2012-04-20T21:24:54.960 に答える