テンプレートとして「より安全な」equals()定義を持つのが好きです。
/**
* Implement equals based on ${cursor}. <br />
* See {@link #compareTo(Object) compareTo}
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(final Object anObject)
{
boolean res = false;
if(anObject == null) { return false; }
if(anObject == this) { return true; }
if(anObject.getClass() == this.getClass())
{
res = this.compareTo(anObject) == 0;
}
return res;
}
常にEqを回避するために:equalsメソッドはスーパークラスのequalsをオーバーライドし、対称ではない可能性があります(EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC
)、ここで:
このクラスは、スーパークラスのequalsメソッドをオーバーライドするequalsメソッドを定義します。両方のequalsメソッドメソッドは、2つのオブジェクトが等しいかどうかの判断にinstanceofを使用します。
equalsメソッドが対称的であることが重要であるため(つまり、)、これには危険が伴いますa.equals(b) == b.equals(a)
。
がB
のサブタイプでありA
、A
's equalsメソッドが引数がであるかどうかをチェックし、instanceof A
B's equalsメソッドが引数がであるかどうかをチェックする場合instanceof B
、これらのメソッドによって定義された同値関係は対称ではない可能性があります。
これは、実装するクラス専用でComparable
あり、次のことが可能です。
- 常に同じであるequalsの実装。
- すべての比較ロジックを1か所にのみ配置する(
compareTo()
関数)。
Comparable#compareTo()
確認を求めるjavadocへの準拠(x.compareTo(y)==0) == (x.equals(y))
(強く推奨されますが、厳密には必須ではありません)。