查看java.util.Collections.unmodifiableMap
实现(OpenJDK 11):
/**
* Returns an <a href="Collection.html#unmodview">unmodifiable view</a> of the
* specified map. Query operations on the returned map "read through"
* to the specified map, and attempts to modify the returned
* map, whether direct or via its collection views, result in an
* {@code UnsupportedOperationException}.<p>
*
* The returned map will be serializable if the specified map
* is serializable.
*
* @param <K> the class of the map keys
* @param <V> the class of the map values
* @param m the map for which an unmodifiable view is to be returned.
* @return an unmodifiable view of the specified map.
*/
public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m) {
return new UnmodifiableMap<>(m);
}
我的问题是,为什么实现不检查传递的 map 可能已经是
UnmodifiableMap
,像这样: public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m) {
if(m instanceof UnmodifiableMap){
return m;
}
return new UnmodifiableMap<>(m);
}
而是可以将此问题扩展到所有其他不可修改的集合,一个简单的检查有助于避免unwanted stackoverflow errors以及不必要的包装。
我想知道为什么没有这样做吗?
另外,由于
UnmodifiableMap
是私有(private)的,因此由用户进行检查(在不使用Reflection/Classloader魔术的情况下)几乎是不可能的。 最佳答案
我总是觉得这有点奇怪,事实上,当您通过以下方式使用Java 9或更高版本执行几乎相同的逻辑操作时:
Map<String, Integer> left = Map.of("one", 1);
Map<String, Integer> right = Map.copyOf(left);
System.out.println(left == right); // true
您可能会看到该实现进行了检查,以确定该Map
是否已经不可变:static <K, V> Map<K, V> copyOf(Map<? extends K, ? extends V> map) {
if (map instanceof ImmutableCollections.AbstractImmutableMap) {
return (Map<K,V>)map;
} else {
return (Map<K,V>)Map.ofEntries(map.entrySet().toArray(new Entry[0]));
}
}
关于java - 为什么Collections.unmodifiableMap不检查通过的 map 是否已经是UnmodifiableMap?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59517676/