2012年2月7日火曜日

【EffectiveJava】項目41

「オーバーロードを注意して使用する」です。

結論:オーバーロードは極力使うな。特に引数パラメータ数が同じ時は。

オーバーロードはプログラマを混乱させる。

興味深い題材を2つ挙げる。

◆オーバーロードとオーバーライドのコンパイル時の違い。
オーバーロードされたメソッドはコンパイル時に選択される。 → 静的
オーバーライドはメソッドが呼び出されたオブジェクトの実行時の型に基づいて選択 → 動的

この事実から、オーバーロードしたメソッドで型をチェックさせようとすると、コンパイル時の型が認識され、型チェックが正しく動作しない。
しかし、オーバーライドは動的なので大丈夫。


◆SetとListのremoveメソッド

これらのremoveメソッドに、Primitive型のint値を渡すと、意図しない値が削除されてしまうことがある。
これは、removeメソッドがListかつint型に関連するメソッドが2種類あり、それは引数の型が異なるが、引数の数が同じであることから問題が発生する。

問題は、Java1.5から導入されたオートボクシング機能により引き起こされる。
remove(int)とremove(Integer)によって振る舞いが異なる。remove(int)は、リストから指定された位置の値を削除します。
一方、remove(Integer)は、渡された引数の値(要素)を削除します。

この違いをプログラマに意識させるのは、混乱を招く、というのもその通りですね。

0 件のコメント:

コメントを投稿