変更可能なマップを静的に初期化する最良の方法は何ですか? 見つけただけ
ImmutableMap.of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5)
しかし、この方法では不変のマップが作成され、パラメーターの固定リストが含まれます。
コードファッションが必要な場合はof
、次を使用できます。
myMap = Maps.newHashMap(ImmutableMap.of(k1, v1, k2, v2...));
さらに、ImmutableMap.Builder
複雑なソースからマップを作成する他の選択肢は次のとおりです。
myMap = Maps.newHashMap(new ImmutableMap.Builder<K, V>()
.put(k1, v1) //One k-v pair
.putAll(otherMap) //From other Map
.put(Maps.immutableEntry(k2, v3)) //From a Map Entry
...
.build());
プラス: 私のコードは ImmutableMap の本来の意図ではありません。名和が Guava ライブラリの使用を主張する場合 ;)
実際には静的初期化は必要ありません。次の何が問題になっていますか?
Map<K, V> map = Maps.newHashMap();
map.put(k1, v1);
map.put(k2, v2);
// More put() calls
// map is now ready to use.
必要に応じて、その周りにヘルパーメソッドを作成できますが、作成できるのは非常に多くの異なるバージョン(1エントリ、2エントリなど)のみです。ある時点で、それはもう役に立たなくなっています。
可変コレクションにこれを使用しても意味がありません。私が考えることができる唯一の理由は、最初に小さな変更可能なマップを作成するときに、これの省略形が必要だということです。この静かさが頻繁に必要な場合は、独自のユーティリティ メソッドを記述します。
public static <K,V> HashMap<K,V> newHashMap(K k1, V v1) {
HashMap<K, V> map = new HashMap<>();
map.put(k1, v1);
return map;
}
public static <K,V> HashMap<K,V> newHashMap(K k1, V v1, K k2, V v2) {
HashMap<K, V> map = new HashMap<>();
map.put(k1, v1);
map.put(k2, v2);
return map;
}
...
まだ読み取り可能であると思われる限り、オーバーライドしてください。私の意見では、キーと値が混在しているため、適切なフォーマットを使用しても、これはすぐに読めなくなります。グアバの人たちは、これを 5 つのキーと値のペアで止めました。