equals()/hashCode()はミュータブルクラスではオーバーライドすべきでない。
artonさんがFindBugs本で書いている通り、ミュータブルなクラスでは、equals()/hashCode()をオーバーライドすべきではない。java.awt.Pointなんかは、ミュータブルでありながら、equals()が実装されているが、これはそもそもフィールドをpublicにさらした事が間違いだし、しかもhashCode()が実装されていないので、Objectの契約にも違反している(原文だと"generally necessary"だから、違反までは行かないかな)。もっとも値が変わるオブジェクトをHashMapやHashSetに入れたら、何が起こるか分からないので、これらのコンテナにPointを放り込むことを想定していないのだと思われる(API仕様書に一言あってもいいと思うのだが)。StringBufferがequals()を実装していないのも、StringBufferがミュータブルだからだろう。
しかしObject.equals()/hashCode()の説明に一言「一般にはミュータブルクラスでは実装すべきではない」と書いてあっても良さそうなものだ。
今度はSuicaが増殖?
みんな挙って、この手のローカルSuicaカードを出しまくるんだろうか。で財布の中は、ポイントカードのかわりに大量のSuicaカードが。複数のSuicaを同時に改札に提示すると、どれが使われるんだろう。というか、そろそろどっかでポイントのアグリゲーションやってくんないかなぁ。そちらの方が、電子マネーよりもよっぽど需要があったりしない?





