我正在阅读的代码,[AbstractMap][1]
我看到了
public V More ...put(K key, V value) {
throw new UnsupportedOperationException();
}
put() 方法抛出异常。
虽然 remove() 有一个很大的实现。并且不会抛出此异常。
有人可以解释为什么如此偏见吗?
我正在阅读的代码,[AbstractMap][1]
我看到了
public V More ...put(K key, V value) {
throw new UnsupportedOperationException();
}
put() 方法抛出异常。
虽然 remove() 有一个很大的实现。并且不会抛出此异常。
有人可以解释为什么如此偏见吗?
默认remove
操作只是迭代条目集而不是聪明。remove
可以“总是” 1以这种方式实现,即使它非常缓慢。
put
总是需要知道精确的实现细节,包括地图是否可修改。
对于不可修改的映射,迭代器不支持remove
,尽管这看起来不平衡。
1仅当迭代器支持删除时,如文档所述,这才是正确的。
该类AbstractMap
被设计为读写和只读映射的基础。
getter 必须实现,所以实现使用抽象方法entrySet
。但是,put
如果地图是只读的,则可能保持未实现。文档说:
要实现一个可修改的映射,程序员必须另外重写这个类的
put
方法(否则会抛出一个UnsupportedOperationException
),并且由返回的迭代器entrySet().iterator()
必须另外实现它的remove
方法。
请注意,设计者可能put
未实现该方法,需要程序员明确地覆盖它。但是,所有只读实现都必须提供相同的实现(即抛出UnsupportedOperationException
),因此设计人员选择将此实现放入共享代码库中。
remove
另一方面,该方法可以根据派生类必须实现的现有操作来实现,因此Java库中的实现是非空的。它假设entrySet().iterator()
实现了它的remove
- 如果没有,AbstractMap
'remove 将抛出迭代器抛出的任何异常remove
,大概是UnsupportedOperationException
.
" If such an entry is found, its value is
* obtained with its <tt>getValue</tt> operation, the entry is removed
* from the Collection (and the backing map) with the iterator's
* <tt>remove</tt> operation, and the saved value is returned."
看看它说的是删除操作是通过迭代器删除操作发生的。我想如果底层 Map 实现是不可变的,它会从它的迭代器 remove 方法中抛出 unsupportedexception。