<< 2006/02/28 | Home | 2006/03/02 >>
PR: 転職    葬式    マンスリーマンション 神戸    北海道    環境    FX    不動産担保融資    桐ヶ谷斎場    海外旅行    専門学校   

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カードが。複数のSuicaを同時に改札に提示すると、どれが使われるんだろう。というか、そろそろどっかでポイントのアグリゲーションやってくんないかなぁ。そちらの方が、電子マネーよりもよっぽど需要があったりしない?

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8