エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

【Java9リリース前復習】不変コレクションの生成

きっかけ

前書いた記事と同じ
環境準備も以前の記事を参照

suzaku-tec.hatenadiary.jp

環境準備の補足

Kitematicの Setting > Volumes を選択して、LOCAL FOLDER をバインドさせたいフォルダに指定する。
お好みだが、自分は、~/dev/notebooks を指定した。

f:id:suzaku0914:20170320181719p:plain

指定したら、念のためにコンテナを再起動する。

そうすると、HOME > WEB PREVIEW にコンテナの内容が表示される。
クリックすると、Webブラウザが立ち上がり、コンテナのファイル操作のためのサービスが立ち上がる。

不変コレクション

やっと本題。
Javaで不変コレクションを作成する場合、かなり手間があった。
実装するとなると、下記のような実装になるはず。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SampleList {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("武藤遊戯");
        list.add("遊城十代");
        list.add("不動遊星");
        list.add("九十九遊馬");
        list.add("榊遊矢");
        list = Collections.unmodifiableList(list);
        System.out.println(list);
    }
}

実行すると、下記のように表示される。

[武藤遊戯, 遊城十代, 不動遊星, 九十九遊馬, 榊遊矢]

試しに、要素を追加してみる。
ソースは下記の通り。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SampleList {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("武藤遊戯");
        list.add("遊城十代");
        list.add("不動遊星");
        list.add("九十九遊馬");
        list.add("榊遊矢");
        list = Collections.unmodifiableList(list);
        list.add("藤木遊作");
    }
}

不変リストなので要素追加できるわけはなく、下記のように実行時エラーになる。
コンパイルエラーに知れくれてもいい気はするが、話を進める。

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
    at SampleList.main(SampleList.java:16)

復習はココまで。
実際に、使うことは多い。
不変のコレクションを定数として使いたい場合がたまにあるので、知らなかった人はきちんと覚えておいたほうが良い。

Java9からの不変コレクション(List/Map/Set)

不変リスト

List<String> list = List.of("abc", "def");

この一行でOK。
試しに要素を追加してみる。
下記のソースで実施。

-> List<String> list = List.of("abc", "def")
|  Added variable list of type List<String> with initial value [abc, def]

-> list.add("Wryyyyyy!")
|  java.lang.UnsupportedOperationException thrown
|        at Collections$UnmodifiableCollection.add (Collections.java:1056)
|        at (#10:1)

追加できない!
ちゃんとできている。

これで、楽に定数宣言できる。

残りのコレクションも同様に紹介

不変マップ

Map<Integer, String> map = Map.of(1, "abc", 2, "def")

不変セット

Set<String> set = Set.of("abc", "def")

感想

とても簡単になった。
Guavaに近い形らしいが、使ったことないので、分からん!