==演算子とEqualsメソッド
一部のコーディング規約で Equals を推奨しているのを見かけたので書かせて頂きました。
ひどいコーディング規約があるなあ。
そう思いつつ、上の記事も、ちょっと書き方が悪い*1。
まず、==演算子は「2つのオブジェクトが『同値』*2かどうかを判断する」、Equalsメソッドは「2つのオブジェクトが『同等』*3かどうかを判断する」もの。Equalsメソッドは、オブジェクトの中身じゃなくて、オブジェクトそのものをあつかうメソッドだから、コンパイル時に型をチェックするという性質のものじゃない。
Equals はタイプセーフではない。このため、型のエラーの発見が遅れる。
この書き方だとEqualsメソッドが危険なもののように読める。Equalsメソッドは、objectを引数にとるわけで、それが本来の動作でもある。コンパイル時にコンパイラが何もいわないのは、それで正しいわけで、この書き方はちょっとよろしくないように思う。
Equalsメソッドを推奨していることが問題なのは、==演算子とEqualsメソッドは異なる目的のためにあるものなのに、それを同じもののように理解してしまっていること。おなじものと思って使えば、同値と判断してtrueが返って欲しいところで、falseが返ることになるようなことが起きる。==演算子とEqualsメソッドを同じものと考えているだけに、わかりにくいバグの原因になる。型のエラーの発見が遅れるとかは副次的なものじゃなかろうか。