为什么Java的AbstractList的removeRange()方法受到保护?

有没有人有任何想法, 为什么在AbstractList (以及在ArrayList中 )removeRange方法是protected ? 它看起来像一个相当明确和有用的操作,但仍然使用它,我们被迫inheritanceList实现。

有一些隐藏的理由吗? 看来对我来说莫名其妙。

是的,因为这不是从外部代码中删除范围。 相反,这样做:

 list.subList(start, end).clear(); 

这实际上是在幕后调用removeRange


OP询问为什么removeRange不是List公共API的一部分。 原因在Effective Java 2nd ed的第40项中描述,我在这里引用它:

缩短过长的参数列表有三种技术。 一种是将方法分解成多种方法,每种方法只需要一部分参数。 如果不小心做到了,这可能导致太多的方法,但也可以通过增加正交性来帮助减less方法数量。 例如,考虑java.util.List接口。 它没有提供方法来查找子列表中元素的第一个或最后一个索引,这两个索引都需要三个参数。 相反,它提供了subList方法,它接受两个参数并返回一个子列表视图 。 此方法可以与indexOflastIndexOf方法结合使用,每个方法都有一个参数,以产生所需的function。 而且, subList方法可以与在List实例上运行的任何方法组合,以subList List执行任意计算。 由此产生的API具有非常高的功率重量比。

有人可能会说, removeRange没有那么多的参数,因此可能不是这个治疗的候选人,但是考虑到有一种方法可以通过subList调用subList ,没有理由使用冗余方法来混乱List接口。


AbstractList.removeRange文档说:

该列表及其子列表上的clear操作调用此方法。 重写此方法以利用列表实现的内部function可以大大提高此列表及其子列表上clear操作的性能。

另请参阅OpenJDK的AbstractList.clearSubList.removeRange的实现。