为什么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
方法,它接受两个参数并返回一个子列表视图 。 此方法可以与indexOf
或lastIndexOf
方法结合使用,每个方法都有一个参数,以产生所需的function。 而且,subList
方法可以与在List
实例上运行的任何方法组合,以subList
List
执行任意计算。 由此产生的API具有非常高的功率重量比。
有人可能会说, removeRange
没有那么多的参数,因此可能不是这个治疗的候选人,但是考虑到有一种方法可以通过subList
调用subList
,没有理由使用冗余方法来混乱List
接口。
† AbstractList.removeRange
文档说:
该列表及其子列表上的
clear
操作调用此方法。 重写此方法以利用列表实现的内部function可以大大提高此列表及其子列表上clear
操作的性能。
另请参阅OpenJDK的AbstractList.clear
和SubList.removeRange
的实现。