名前も知らないSEでしょう

この木なんの木気になる樹

Java

Arrays#asListを利用するときの注意点

投稿日:

たまにはやる気を出していくスタイル。軽いものでいいので何かを書いていこうそうしよう。

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("ひ", "で", "ぶ"));

以上。

336x280

336x280

-Java
-

Copyright© この木なんの木気になる樹 , 2017 AllRights Reserved.