ぺんぎんらぼ

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です。たまに絵を描きます。

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です

Java Tips - Listの初期化

java.util.Listオブジェクトの初期化方法いろいろです。

addメソッドを使って初期化

基本ですね。初期化する要素ごとにListインターフェースのaddメソッドを使用して初期化します。

List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("orange");
fruits.add("grape");

Arrays.asListを使って初期化

ArraysクラスのasListメソッドを使用して初期化します。コードがシンプルになります。

List<String> fruits = Arrays.asList("apple", "orange", "grape");

この方法は注意が必要です。生成されるListの実装クラスはjava.util.Arraysの内部クラスArrayListになります。java.util.ArrayListとは別物です。そして、生成されたListオブジェクトは変更不可能になるので、Listの内容を変更すると、例外UnsupportedOperationExceptionが発生します。
初期化後にListオブジェクトの内容を変更する場合、以下のようにListの実装クラスをnewして、引数にArrays.asListで生成したListを指定します。

List<String> fruits = new ArrayList<>(Arrays.asList("apple", "orange", "grape"));

インスタンスイニシャライザを使って初期化

あまり知られていませんが、インスタンスイニシャライザというものを使うことで初期化コードを書くことができます。
インスタンスイニシャライザ内でaddメソッドを使用して初期化します。 いくつか注意点があります。

  • addメソッドを使うときに、オブジェクトは指定せず、単に「add("~")」と記述します。
  • ArrayListは、Serializableインターフェースを実装しているので、シリアルバージョンIDを定義しないと、IDE上で警告が表示されます。
List<String> fruits = new ArrayList<>() {
    private static final long serialVersionUID = 1L;
    {
        add("apple");
        add("orange");
        add("grape");
    }
};

利点が少ないので、この記法をとることは少ないでしょう。

List.ofを使って初期化

Java9で追加されたListインターフェースのofメソッドを使用して初期化します。Arrays.asListと同様、コードがシンプルになります。

List<String> fruits = List.of("apple", "orange", "grape");

この初期化方法も、Arrays.asListと同様、変更不可能なListが生成されるので、変更する場合は、実装クラスのインスタンスを生成して、引数にList.ofメソッドで生成したListオブジェクトを指定します。

Java9以降のバージョンであれば、Arrays.asListより、こちらのList.ofのほうが同じListインターフェースを使っているので、見た目が良いですね。