2014年04月13日

Effective Java第三章

Effective Java輪読会に向けた予習です。

第三章は項目8〜12。発表は @itokami1123 さんが担当になってたハズ。。。

さて。



項目8 equalsをオーバーライドするのは一般契約に従う。
オーバーライド時にルールを守らないとおかしな事になる、までは想定内。
反射的とか対象的とか推移的とかどこかで聞いたキーワード。
まあ、同値関係 - Wikipedia ですよね? ですが、これに加えて、整合的とか引数がnullならfalseとかあります。
で。
これ、継承まで考慮すると不味い事起きるんですね。対称性が保証出来なくなったりする。。。(汗)
また信頼出来ない資源に依存しては駄目だと。これについて、java.net.URLもやらかしていたと。。。




項目9 equalsをオーバーライドする時は、常にhashCodeをオーバーライドする
等しいオブジェクトは同じhashCodeを返さないといけない…を如何にうまく実装するか。
一応、常に固定の値を返すようにすれば正当になるけれど、それはさいあくだー。。。
可能な限り、違うオブジェクトは違うhashCodeを返した方が良い。
で、どうするかって話をざっとまとめると、オブジェクトを一意に識別するために必要充分な項目のhashCodeをすべて求め、
任意の初期定数に31を乗算しながら算出したhashCodeを加算していく・・・ような感じっぽい。
遅延初期化で実装することも出来そう。
なお、"オブジェクトを一意に識別するために必要充分な項目"から項目を減らすのはやるべきでは無いとの事。
おそらくは無駄なキー衝突を避けるためでしょうけれど。。。




項目10 toStringを常にオーバーライドする
これは・・・そうですよね。
オーバーライドする自体は面倒だけれど、実装されていると使う側はうれしい。




項目11 cloneを注意してオーバーライドする
deepcopyするcloneメソッド作るの大変だし、下手に継承するよりcopyメソッド作った方が楽じゃない??




項目12 Comparableの実装を検討する
equalsと同じような約束事を守りつつ、compareToメソッドを実装出来れば、ソート処理等に使われるので嬉しい事になりそう。




とりあえず、こんなところ。
次は第4章。自分の担当分なので、資料も作らないと。。。
タグ:JAVA
posted by tksy at 23:47| Comment(0) | 自宅学習
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: