有没有人有任何想法,为什么 AbstractList(以及ArrayList}中的removeRange方法是protected
?它看起来像一个非常明确且有用的操作,但是,使用它,我们仍然被迫继承List实现。
是否有一些隐藏的理由?对我来说似乎很难解释。
答案 0 :(得分:158)
是的,因为这不是你从外部代码中删除范围的方式。相反,这样做:
list.subList(start, end).clear();
这实际上是在幕后调用removeRange
。†
OP询问为什么removeRange
不属于List
公共API。原因在Effective Java 2nd ed的第40项中描述,我在这里引用它:
有三种技术可以缩短过长的参数列表。一种方法是将方法分解为多种方法,每种方法只需要一部分参数。如果不小心完成,这可能导致太多方法,但它也可以通过增加正交性来帮助减少方法计数。例如,考虑
java.util.List
接口。它没有提供查找子列表中元素的第一个或最后一个索引的方法,这两个索引都需要三个参数。相反,它提供subList
方法,该方法接受两个参数并返回子列表的视图。此方法可以与indexOf
或lastIndexOf
方法结合使用,每个方法都有一个参数,以产生所需的功能。此外,subList
方法可以与任何方法结合使用,该方法在List
实例上运行,以对子列表执行任意计算。由此产生的API具有非常高的功率重量比。
有人可能会说removeRange
没有那么多参数,因此可能不是这种治疗的候选者,但考虑到有办法通过removeRange
调用subList
,没有理由用冗余方法弄乱List
接口。
† AbstractList.removeRange
文档说:
此方法由此列表及其子列表上的
clear
操作调用。重写此方法以利用列表实现的内部可以基本提高此列表及其子列表上clear
操作的性能。
另外,请参阅OpenJDK的AbstractList.clear
和SubList.removeRange
的实现。