2 つの型がA
ありB
、両方に一意のid
フィールドがあるとします。通常、 equals() および hashCode() メソッドを実装する方法は次のとおりです。
@Override
public boolean equals(Object obj) {
return obj instanceof ThisType && obj.hashCode() == hashCode();
}
@Override
public int hashCode() {
return Arrays.hashCode(new Object[] { id });
}
その場合、A
とB
両方がそれぞれid
のフィールドを設定する 1 引数のコンストラクターを持っていることを考えると、
new A(1).equals(new A(1)) // prints true as expected,
new A(1).equals(new A(2)) // prints false as expected,
new A(1).equals(new B(1)) // prints false as expected.
だけでなく、
new A(1).hashCode() == new B(1).hashCode() // prints true.
2 つのオブジェクトが同じ型でなくても、2 つの hashCode が等しいかどうかは問題なのでしょうか? hashCode() は equals() 以外の場所で使用できますか? はいの場合、どのような目的で?
私は次のように2つの方法を実装することを考えました:
@Override
public boolean equals(Object obj) {
return obj != null && obj.hashCode() == hashCode();
}
@Override
public int hashCode() {
return Arrays.hashCode(new Object[] { getClass(), id });
}
クラスを hashCode 生成に追加すると、この潜在的な問題が解決されます。どう思いますか?それは必要ですか?