2014年07月06日

Effective Java輪読会 vol2・Effective Java第五章

2014/07/04に「Effective Java輪読会 vol2」に行って来ました。

今回は準備が出来ていない中みんなで読んで行く突発パターンでした。
さて、復習として。
第五章 ジェネリクス
章全体を通して示されたメッセージは・・・「原型使うな! ジェネリクス使え!」で話が終わるようです。

項目23 新たなコードで原型を使用しない

Listのようなジェネリクスが導入されたのはJava5.0からです。
Java1.4まではListのような原型で辛い目を見てきました。
Java5.0以降、そんじょそこらのプログラムで原型を使うべきケースはありません!!!
で、後は・・・

ワイルドカード型というものがある。
Setみたいな。
これは、null以外の要素を入れる事が出来ない。

Javaのジェネリクスはコンパイル時の型安全を提供しているが、移行互換性が要件にあったためジェネリック型情報は実行時に消されている。
そのため上記の例外として、クラスリテラルを使用する場合には原型を使用すること。
似た話として、instanceof演算子でも原型を使用する事。




項目24 無検査警告を取り除く

@SuppressWarningアノテーションで警告を抑制出来るが、コレは最後の手段とする事。
可能な限り警告を取り除く事。
エラーにならないと確信を持っていてやむを得ない場合に限り、最小単位で@SuppressWarningアノテーションを使用すること。




項目25 配列よりリストを選ぶ

配列は共変で具象化されているという点でジェネリック型と異なっている。
ジェネリック配列はコンパイラによって許されていない。
まとめると配列とジェネリクスは非常に異なった型規則を持っているため、一般的にうまく調和しない。
混在させるのではなく、原則的にはリストを選ぶ事。




項目26 ジェネリック型を使用する

自分独自のクラスを作る場合にジェネリック型とする方法について。
結構大変な感じ。
だけれど、それを使うクライアントのコードが安全で使いやすいものとなるため、ジェネリック型を使おう。




項目27 ジェネリックメソッドを使用する

staticメソッドを作る場合にジェネリックメソッドとする方法について。
先ほどと同じく、頑張って対応してください。
比較的まれなケースとして、再帰型境界というのもある。
例)
public interface Comparable {
int compareTo(T o);
}
その結果、こんな宣言のメソッドも存在し得る。
public static > T max(List list)




項目28 APIの柔軟性向上のために境界ワイルドカード型を使用する

境界ワイルドカード型を使うと、APIを使用するクライアントが嬉しい。
プロデューサー(producer)-extends、コンシューマー(consumer)-superの原則に基づいて頑張れ。
public static > T max(List numbers = Union.union(integers, doubles);




項目29 型安全な異種コンテナーを検討する

ClassクラスがJava5.0でジェネリック化されてClassになったので、なかなかキモいこともできるよ。
ClassにcastメソッドやasSubclassとかメソッド増えてるから、フレームワークを作るような事があったら使うかも。





ざっと、こんなところでしょうか??
posted by tksy at 17:31| Comment(0) | 勉強会
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: