Java言語で固定要素のListを初期化する際のイディオム

Generics(総称型)のプログラミングはJava言語(バージョン5以降)で最も習得が困難な文法*1の一つです。私自身、時々どうやって文法エラーを修正すべきか悩むこともあるくらいで、実際かなり複雑です。Genericsの導入は賛否両論なので、実際Javaに導入したのは間違いだったという議論もある一方で、静的な型安全性を重視するプログラマーもいます。
好き嫌いはともかくとして、Javaプログラマーとしては、一度きちんとGenericsの正しい使い方(=使い勝手のよい総称型やメソッドの正しい定義方法)について勉強しておいてもよいと思います。

Java Generics and Collections: Speed Up the Java Development Process

Java Generics and Collections: Speed Up the Java Development Process

それで、Genericsそのものとは直接関係がないのですが、この本のサンプルコードを読んでいて、覚えておくと便利なポイントを思い出したので紹介しておきます。特にJUnitの単体試験を作成するときによく使うことですが、Listオブジェクトに対して固定の要素を格納しておきたいことがよくあります。Groovy*2では

def list = ["data1", "data2", "data3"]

でよいですが、Javaの場合、以下のようなコードを結構よく目にします。

List<String> list = new ArrayList<String>();
list.add("data1");
list.add("data2");
list.add("data3");

かなり冗長なコードですね。知っている人には常識かもしれませんが、このような場合、Java5以降の文法では以下のような記述が可能です。

List<String> list = Arrays.asList("data1", "data2", "data3");

可変長引数とGenericsを組み合わせたイディオムですね。知っているとちょっと便利だと思います。
(追記)
なお、このイディオムで生成されたListはArrayListインスタンスではなく、add()やremove()などの要素の追加削除はできません。こうした操作が必要なら

List<String> list = new ArrayList<String>(Arrays.asList("data1", "data2", "data3"));

と書く必要があります。結局、かなり冗長ですね。
可能ならGoogle-collectionsのLists.newArrayList()を使うのもよいでしょう。

List<String> list = Lists.newArrayList("data1", "data2", "data3");

http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Lists.html

*1:総称型を使うというだけでなく、正しく定義するというところが困難な理由の一つ。また、型消去、変性など概念的にも理解が難しい事項が多い。

*2:総称型という意味ではScalaなどの例をあげた方が適切であったかもしれませんが、ここでは簡潔なListの初期化という点が論点なので。