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をオーバーライドする上での処方箋。
- 引数が自身のオブジェクトへの参照であるか検査するのに==を使用する。
- 引数が正しい型であるか検査するのにinstaceofを使用する。
- 引数を正しい型にキャストする。上記2が行われているので成功することが保証される。
- 2つのオブジェクトのフィールド(論理等価性検査に必要な)同士が一致するか検査する。
- equalsを書き終え、対称性、推移性、整合性が満たされているかテストする。
- hashcodeをオーバーライドする。
- equals宣言の引数の型をObject型から他の型に置き換えない。
正○
public boolean equals(Object o){
・・・
}誤×
public boolean equals(MyClass o){
・・・
}