ジェネリクスを使用してスマートにリストを生成する

以前、どこかのブログで読んで「便利だなー」と思ったきり、すっかり忘れていたのでメモ。

一般的なリスト生成方法

Java5以降で、リストを生成するときは通常以下のようにする。

List<String> list = new ArrayList<String>();

コンパイル時にミスが発見できるジェネリクスを使わない手はないだろう。しかし、このコードには1つ不満な点がある。それは、リストの宣言と生成の2箇所において、扱う型としてStringを指定している点だ。これは、DRY原則(Don't Repeat Yourself=同じことを繰り返すな)に反する。

スマートなリスト生成方法

List<String> list = newArrayList();
public static <E> ArrayList<E> newArrayList() {
    return new ArrayList<E>();
}

newするコードを書くのではなく、ArrayList生成用のメソッドを用意して、それを呼び出すようにしている。型はコンパイラが推測してくれるので、メソッド呼び出し時に型を指定する必要がない。

この例では、そんなに恩恵を受けていないようにも見えるけど、Mapを格納する場合などには、コードがかなりすっきりする。

List<Map<String, EmployeeDto>> list = newArrayList();

ちなみにHashMapなどについても同様の実装が可能。

Map<Integer, String> map = newHashMap();

こういったAPIが用意されているライブラリ

今回は必要な分だけ自前で実装していたのだが、実装後にS2Containerに付属している(?)S2Tigerのorg.seasar.framework.util.tiger.CollectionsUtilに、同様のAPIが一通り用意されていることが分かった。今度からはこれを利用することにしよう。

まとめ

コレクション系のクラスを生成する際は、

List<Foo> list = newArrayList();

と書いてコード量を削減してしまおう!