【Java】Listの初期化時に値を設定する方法

JavaのListへ初期化時に値をセットする方法ですが、こちらいくつか方法があります。

大きな違いとしては、初期化後にそのListに対して別の値をaddできる方法とできない方法の2つに分けることができます。

今回は上記できる方法とできない方法の2種類を紹介していきます。

[スポンサーリンク]

オススメロジック

こちらのロジックではList初期化後でもaddを使って値を追加できる方法です。
とくに理由がなければこちらの方法をオススメします。

List<String> list2 = 
    new ArrayList<>(Arrays.<String>asList("AAA", "BBB", "CCC"));
list2.add("DDD");
list2.stream().forEach(s -> System.out.println(s));
System.out.println(result);

上記ロジックのArrays.asListのジェネリクスは省略することもできます。

List<String> list3 = 
    new ArrayList<>(Arrays.asList("AAA", "BBB", "CCC"));
list3.add("DDD");
list3.stream().forEach(s -> System.out.println(s));

オススメしないケース

こちらのケースではListへaddすると例外が発生してしまいます。
Listに追加する予定がないといってもあまり使わない方がよいです。(他の人が知らずに追加して例外が発生というのを回避するという理由です。)

List<String> list1 = Arrays.asList("AAA", "BBB", "CCC");
list1.stream().forEach(s -> System.out.println(s));

試しにaddしてみましょう。UnsupportedOperationExceptionが発生しました。

List<String> list1 = Arrays.asList("AAA", "BBB", "CCC");
list1.add("DDD");
list1.stream().forEach(s -> System.out.println(s));
>実行結果
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at jp.co.example.App6.main(App6.java:20)

addするとエラーになる理由

Arrays.asListを使ってaddメソッドを実行するとUnsupportedOperationExceptionになる理由ですが、asListメソッドを追っていけばその理由がわかります。

まずはasListメソッドを見ていきましょう。asListメソッドはArrayListをインスタンス化していますね。ではArrayListも見てみましょう。

    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

ArrayListにはaddメソッドがありませんね。では継承している親クラスのAbstractListをみてみましょう。

    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
    // 省略
    }

addメソッドがあった!おお、、さらにaddをよんでいますね。次のaddも追っていきましょう。

    public boolean add(E e) {
        add(size(), e);
        return true;
    }

なんとここで例外を発生させていました。ArrayListで@Overrideさせてaddが実装されていればaddできたのでしょうがArrayListではオーバーライドされていないのでここの部分が呼ばれてUnsupportedOperationExceptionとなる仕組みだったようです。

    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

Javaのバージョン

今回検証したjavaのバージョンは8です。

さいごに

List初期化後にaddする予定がなくてもaddが使える方(オススメケース)の方があとでソースを見る人からすると嬉しいですね。

それでは!