UnmodifiableMap (Java Collections) vs ImmutableMap (Google)
2022-08-31 09:18:20
上下文
我需要返回对用于数据缓存的地图的引用,并且我想确保没有人可以修改其引用。
问题
我在网上看到了很多对UnmodifiableMap和ImmutableMap的引用,但我没有看到任何比较/对比它们的东西。我认为Google / Guava创建自己的版本有一个很好的理由 - 有人可以告诉我它是什么吗?
上下文
我需要返回对用于数据缓存的地图的引用,并且我想确保没有人可以修改其引用。
问题
我在网上看到了很多对UnmodifiableMap和ImmutableMap的引用,但我没有看到任何比较/对比它们的东西。我认为Google / Guava创建自己的版本有一个很好的理由 - 有人可以告诉我它是什么吗?
不可修改的地图仍可能发生变化。它只是可修改地图上的视图,并且支持地图中的更改将通过不可修改的地图可见。不可修改的地图仅阻止那些仅引用不可修改视图的人进行修改:
Map<String, String> realMap = new HashMap<String, String>();
realMap.put("A", "B");
Map<String, String> unmodifiableMap = Collections.unmodifiableMap(realMap);
// This is not possible: It would throw an
// UnsupportedOperationException
//unmodifiableMap.put("C", "D");
// This is still possible:
realMap.put("E", "F");
// The change in the "realMap" is now also visible
// in the "unmodifiableMap". So the unmodifiableMap
// has changed after it has been created.
unmodifiableMap.get("E"); // Will return "F".
与此相反,番石榴的不可变地图实际上是不可变的:它是给定地图的真实副本,没有人可以以任何方式修改这个不可变地图。
更新:
正如注释中指出的那样,也可以使用标准API创建不可变的映射,使用
Map<String, String> immutableMap =
Collections.unmodifiableMap(new LinkedHashMap<String, String>(realMap));
这将在给定地图的真实副本上创建一个不可修改的视图,从而很好地模拟了的特征,而不必将依赖性添加到番石榴中。ImmutableMap
看看ImmutableMap JavaDoc:doc
那里有关于这方面的信息:
与 Collections.unmodifiableMap(java.util.Map) 不同,Collections.unmodifiableMap(java.util.Map) 是一个仍然可以更改的单独映射的视图,ImmutableMap 的实例包含自己的数据,永远不会更改。ImmutableMap对于公共静态最终映射(“常量映射”)很方便,并且还允许您轻松制作调用方提供给类的映射的“防御性副本”。