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 になる。これが一番良い感じかも。