12

変更可能なマップを静的に初期化する最良の方法は何ですか? 見つけただけ

ImmutableMap.of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5)

しかし、この方法では不変のマップが作成され、パラメーターの固定リストが含まれます。

4

3 に答える 3

22

コードファッションが必要な場合は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 ライブラリの使用を主張する場合 ;)

于 2012-09-01T14:06:07.750 に答える
4

実際には静的初期化は必要ありません。次の何が問題になっていますか?

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エントリなど)のみです。ある時点で、それはもう役に立たなくなっています。

于 2012-08-31T15:37:13.787 に答える
3

可変コレクションにこれを使用しても意味がありません。私が考えることができる唯一の理由は、最初に小さな変更可能なマップを作成するときに、これの省略形が必要だということです。この静かさが頻繁に必要な場合は、独自のユーティリティ メソッドを記述します。

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 つのキーと値のペアで止めました。

于 2012-08-31T15:56:18.400 に答える