なぜアリ規程、マニュアルの方法は慎重に使用する必要がありますは、Arrays.asList

序文

開発では、時には複数のパラメータに遭遇した、またはニーズのリスト配列に回すために、我々は通常は、Arrays.asList()メソッドを使用します。しかし、この方法は、一歩間違え意志真剣異常、プロセスで使用されます。私たちは、次のコードを持っています:

@Test
public void test() {
    List<String> list = Arrays.asList("a", "a", "2");
    System.out.println(list.size());

    list.add("blog.happyjava.cn");
    System.out.println(list.size());
}
复制代码

操作の後、例外がありました:

法令Javaでアリ必須要件

アリJavaが法律で義務的な要件があります。コレクションに配列は、あなたが方法の関連セットを修正するためにそれを使用できない場合のツールは、Arrays.asList(の使用)を、それが明確な方法はUnsupportedOperationException例外がスローされます/削除/追加します。

アリ規程は、すでにasListは内部クラスの配列であるオブジェクトの復帰を促しました。さて、この内部クラスは、今、私たちは、一般的には、ここで我々が分析する必要が同じ場所で何(例えばArrayListのような)リストを使用しています。

Arrays.asList()ソースコード解析

次のように、ソースコードのメソッドを表示しIDEA。

ここでは、ArrayListのを返す問題はないようですが、私たちのいつものjava.util.ArrayListのこのArrayListの同じではありません。IDEAでジャンプを打ち、あなたは、これは内部のArrayListクラスの配列で見ることができます。

内部クラスのソースコードは、実際にあまりないです、構造IDEAによって、我々はそれが次のメソッドを実装していることがわかります。

あなたが見ることができる、これは我々が最も一般的に使用されるメソッドを追加達成されていません。

その後、例外はそれから放り出された時間、UnsupportedOperationExceptionが呼び出す他のメソッドを追加しますか?私たちは、それはjava.util.AbstractListクラスを継承して見て、次のようにクラスメソッドを追加します。

public boolean add(E e) {
    add(size(), e);
    return true;
}
复制代码

そこオーバーロードされたメソッドを追加し、ビューにポイント:

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

これは、UnsupportedOperationExceptionをスローここで見ることができます。

概要

Arrays.asList()は非常に一般的な方法の開発であるので、我々はその存在のピットを理解する必要があります。それが私たちの共通のjava.util.ArrayListのようArrayListのを返した場合、生産リスクを築くために非常に簡単です。

おすすめ

転載: juejin.im/post/5d0cdc0751882532cf35e245