たまにはやる気を出していくスタイル。軽いものでいいので何かを書いていこうそうしよう。
Javaでテストを作成するときなど、手軽に決まった値のListを生成するときなど、Arrays#asListは便利ですよね。ただし、初心者が陥りがちな罠があります。
Arrays#asListで生成するリストは固定
JavaのArraysクラスのAPIを見るとわかりますが、Arrasy#asListの要素数は固定です。
asList(T... a)
指定された配列に連動する固定サイズのリストを返します。
つまりどういうことかと言いますと、要素の追加や削除ができない、ということです。
addやremoveを呼び出すと、UnsupportedOperationExceptionがスローされます。
Arrays#asListの実装を確認して見ると、こんな感じです。パっとみた感じでは、ArrayListの新しいインスタンスを返却しているので問題なさそうに見えます。
public static <T> List<T> asList(T... a) { return new ArrayList<>(); }
では、このArrayListは何者かをよく確認してみると、我々が普段利用するjava.util.ArrayListではありません。よーく見ると、ArraysクラスのインナークラスのArrayListクラスです。
そして、このインナークラスのArrayListは、addやremoveを実装していません。そのため、addやremoveが呼び出されるとスーパークラスのAbstractListのaddやremoveが呼び出され、UnsupportedOperationExceptionがスローされることになります。
Arrays#asListを使ってミュータブルなリストを生成する方法
どうしても俺はArrays#asListを使いたいんや!こいつでaddしたいんや!みたいな人がいるならば、ArrayListのコンストラクタに突っ込んでやれば良いかと思います。
List<String> list = new ArrayList<>(Arrays.asList("ひ", "で", "ぶ"));
以上。