Java の List の初期値を1行で設定する方法

Java における List で、変数の宣言時に初期値を一緒に入れる方法がないかな~と思って探してた。

普通に書こうとするとこうなっちゃって鬱陶しいよね。

List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");

ちょうどドンズバな Gist があったので紹介。

// java.util.List の初期化を一行で書く
List<String> list = new ArrayList<String>() {{add("a"); add("b"); add("c");}};

// 変更不可能な List で良い場合は
List list = Arrays.asList("a", "b", "c");
// Arrays.asList をジェネリックスを使って書くと
List<Integer> list = Arrays.<Integer>asList(1, 2, 3);

// asList を使いつつ、追加可能な List を作るには、冗長だが以下のようにする
List<Integer> list = new ArrayList<Integer>(Arrays.<Integer>asList(1, 2, 3));

同じネタを解説してる Qiita の記事と共に、使ってみた感想をば。

new ArrayList<String>() {{ add("a"); add("b"); add("c"); }};

以下のように改行すると構造が分かりやすい (上の Qiita 記事より転載)。

List<String> list = new ArrayList<String>() {
    {
        add("AA");
        add("BB");
        add("CC");
    }
};

インスタンスイニシャライザという、インスタンスの生成時にメソッドを呼ぶ書き方らしい。毎回 add() と書いてるのが冗長っぽい感じがするのと、Eclipse でこの書き方をすると serialVersionUID 打てよ的なワーニングが出て鬱陶しい。

Arrays.<Integer>asList(1, 2, 3);

Arrays.asList() ってのは要素の追加・削除ができない固定サイズのリストを返すらしく、ArrayList のインスタンスにはならないんだとか。なんでこんな作りのユーティリティクラスになっているのかはよく知らない。リストを後から操作することがなくて、参照専用なのであれば、これが一番シンプルかな。

new ArrayList<Integer>(Arrays.<Integer>asList(1, 2, 3));

ArrayList のコンストラクタに Arrays.asList() を渡せば、追加・削除ができる ArrayList になる。これが一番良い感じかも。