equalsのoverride規範

次の条件を満たす場合にequalsをオーバーライドする。

  • そのクラスが論理等価性(logical equality)検査を提供する必要がある。
  • スーパークラスが適当なequalsを持っていない。

次の一般規約を遵守する。

  • 反射性:xがnullでない場合、x.equals(x)はtrueを返す。
  • 対称性:x,yがnullでない場合、x.equals(y)がtrueを返す場合のみy.equals(x)はtrueを返す。
  • 推移性:x,y,zがnullでない場合、x.equals(y)とy.equals(z)がtrueを返すならばx.equals(z)はtrueを返す。
  • 整合性:x,yがnullでない場合、equals比較に使用する情報が変更されない限り終始一貫してtrue、またはfalseを返す。
  • xがnullでない場合、x.equals(null)はfalseを返す。

equalsをオーバーライドする上での処方箋。

  1. 引数が自身のオブジェクトへの参照であるか検査するのに==を使用する。
  2. 引数が正しい型であるか検査するのにinstaceofを使用する。
  3. 引数を正しい型にキャストする。上記2が行われているので成功することが保証される。
  4. 2つのオブジェクトのフィールド(論理等価性検査に必要な)同士が一致するか検査する。
  5. equalsを書き終え、対称性、推移性、整合性が満たされているかテストする。
  6. hashcodeをオーバーライドする。
  7. equals宣言の引数の型をObject型から他の型に置き換えない。


正○
public boolean equals(Object o){
・・・
}

誤×
public boolean equals(MyClass o){
・・・
}