【问题标题】:The best way to static initialization of Maps in google collections在谷歌收藏中静态初始化地图的最佳方法
【发布时间】:2012-08-31 15:25:11
【问题描述】:

对可修改地图进行静态初始化的最佳方法是什么?我只找到了

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

但是这种方式创建了不可变映射并包含固定的参数列表。

【问题讨论】:

标签: java guava


【解决方案1】:

如果你确实想要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 的初衷。如果 Nawa 坚持使用 Guava 库 ;)

【讨论】:

  • 不过,这在垃圾创建方面有点浪费。在第一种情况下,只要您想创建一个HashMap,就创建一个临时的ImmutableMap,在第二种情况下,您创建一个ImmutableMap.Builder(其中包含一个可变的Map),然后创建一个@987654329 @ 在最终创建 HashMap 之前...
  • @FrankPavageau 是的,你是对的。我的代码不是 ImmutableMap 的初衷。我的意思是如果 Nawa 坚持使用 Guava 库 ;)
【解决方案2】:

您实际上并不需要静态初始化。以下有什么问题?

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 个条目等)。在某些时候它不再有帮助了。

【讨论】:

  • 嗯,不。要么为要初始化 Map 的每个条目数编写一个静态方法,要么编写一个以 Object[] 或 Object... 作为参数的静态方法,并确保其长度是 2 的倍数(到获得整数个条目),但随后您将丢失任何类型检查。我说坚持put()s的顺序。
【解决方案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;
}

...

只要您认为它仍然可读,就覆盖它。由于键和值的混合,我认为这很快就会变得难以理解——即使格式正确。 Guava 伙计们在 5 个键值对上停止了这个,恕我直言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多