不変マップの初期化方法
不変マップの初期化方法は大きく下記2つの方法があります。
- Map.of()
- Map.ofEntries()
いずれもJavaSE9、JDK9以降に導入された機能になります。
https://docs.oracle.com/javase/jp/9/docs/api/java/util/Map.html
それではそれぞれの使い方を見ていきましょう。
Map.of()
下記ドキュメントを参照しますと分かるとおり、of()の引数は、0〜10個の要素(キーとバリューのマッピング)を指定することができます。
例えば、要素数が2つの不変マップを初期化する場合
import java.util.Map;
Map<String, String> mapOf = Map.of(
"key1", "value1",
"key2", "value2"
);
Map.of()はキーとバリューを交互に指定していきます。
要素が1個とか2個のときはどれがキーでどれがバリューか分かりやすいですが、要素数が増えてくるとちょっと分かりにくくなりそうですね。
実際は、キーとバリューの名前がプログラム例のように『keyXX』とか『valueXX』とか分かりやすく命名されているはずもないので。
Map.ofEntries()
Map.ofEntries()
は指定したエントリから抽出されたキーと値を含む不変マップを作成します。
import java.util.Map;
import static java.util.Map.entry;
Map<String, String> mapOfEntries = Map.ofEntries(
entry("key1", "value1"),
entry("key2", "value2")
);
要素ごとにentry("key", "value")を指定します。
Map.ofEntries()
は指定できる要素数に制限はないため、要素数が増えても簡単に要素追加できますし、entry()で区切られているためキーとバリューのマッピングが一見して分かりやすいです。
Map.ofEntries()
を推奨する理由
ここまでMap.of()
とMap.ofEntries()
をそれぞれ見てきました。
最後にMap.ofEntries()
を推奨する理由をまとめていきます!
可変性
Map.of()
は最大10個の要素しか指定できず、11個以上の要素を指定できないという可変性の低さがあります。
そのため11個以上に要素が増える可能性がある場合は使用を避けるべきです。
その点、Map.ofEntries()
は、要素数の制限はないため、要素数が増えても簡単に追加することができます。
可読性
先述したとおり、Map.of()
はKeyとValueを交互に指定していきます。
要素が1個とか2個のときはどれがキーでどれがバリューか分かりやすいですが、要素数が増えていくと最大20個の要素が横並びすることになり、可読性を著しく損ないます。(IDEやエディタのコードフォーマットをしたら少しは見やすくなりますが)
一方でMap.ofEntries()
は要素数の制限はなく、要素1つを指定する毎にentry(key, value)を指定するため、下記のように要素数が増えても簡単に要素追加できますし、キーとバリューの組み合わせが分かりやすいです。
import java.util.Map;
import static java.util.Map.entry;
Map<String, String> mapOfEntries = Map.ofEntries(
entry("1", "1"),
entry("2", "2"),
entry("3", "3"),
entry("4", "4"),
entry("5", "5"),
entry("6", "6"),
entry("7", "7"),
entry("8", "8"),
entry("9", "9"),
entry("10", "10"),
entry("11", "11")
);