equals
まず、またはhashCode
メソッドを計算するときに、スーパークラスからの状態を含めないでください。その状態は、作業しているクラスの範囲外であり、クラスは、その機能を書き換えるのではなく、スーパークラスに依存する必要があります。
equals
IntelliJを使用して生成するときhashCode
に、親クラスからの計算を含める場合は、super.equals(o)
またはへの呼び出しを追加するメソッドに小さな変更を加えるだけsuper.hashCode()
です。
これらのメソッドを実装する別の方法は、EqualsBuilder
Apache Commons Langライブラリーを使用することです。これらのビルダーは、スーパー呼び出しを追加するためのセマンティクスを提供します。HashCodeBuilder
編集:
「このクラスのインスタンスの平等とは、サブクラスのIDを無視するという意味ですか?」と答えます。:すでに指摘したように、2つのクラスがあり、一方が他方を拡張し、サブクラスがどちらもオーバーライドしない場合、equals
またはhashCode
、2つのインスタンスが等しいかどうかをチェックする(またはハッシュ構造に追加する)と、両方が同じクラスのものであるかのように動作します。次に例を示します。
class A {
private int intField = 2;
public A(int value) {
intField = value;
}
public boolean equals(Object o) {
if (null == o) return false;
if (this == o) return true;
if (!(o instanceof A)) return false;
return intField == ((A) o).intField;
}
public int hashCode() {
return 11 * intField;
}
}
class B extends A {
private boolean boolField = true;
public B(int intValue, boolean boolValue) {
super(intValue);
boolField = boolValue;
}
// no equals or hashCode
}
したがって、これらのクラスでは、次のことに直面します。
A a = new A(12);
B b = new B(12, false);
b.equals(a); // returns true
これを回避するには、IntelliJで生成した後、equals
またはメソッド内にスーパーコールを追加するだけです。hashCode
class B extends A {
private boolean boolField = true;
public B(int intValue, boolean boolValue) {
super(intValue);
boolField = boolValue;
}
public boolean equals(Object o) {
if (null == o) return false;
if (this == o) return true;
if (!(o instanceof B)) return false;
if (!super.equals(o)) return false;
return boolField == ((B) o).boolField;
}
public int hashCode() {
int hash = super.hashCode();
hash += 11 * Boolean.valueOf(boolField).hashCode();
return hash;
}
}
もう1つの方法は、すでに述べたように、ApacheCommonsLangライブラリのビルダーを使用することです。