有谁知道,为什么AbstractList(以及ArrayList)中的removeRange 方法是protected
?它看起来像是一个定义明确且有用的操作,但仍然要使用它,我们不得不继承 List 实现。
有什么隐藏的理由吗?对我来说似乎很莫名其妙。
有谁知道,为什么AbstractList(以及ArrayList)中的removeRange 方法是protected
?它看起来像是一个定义明确且有用的操作,但仍然要使用它,我们不得不继承 List 实现。
有什么隐藏的理由吗?对我来说似乎很莫名其妙。
是的,因为这不是您从外部代码中删除范围的方式。相反,请执行以下操作:
list.subList(start, end).clear();
removeRange
这实际上是在幕后调用。†</sup>
OP 询问为什么removeRange
不是List
公共 API 的一部分。原因在 Effective Java 2nd ed 的 Item 40 中有描述,我在这里引用它:
有三种技术可以缩短过长的参数列表。一种是将方法分解为多个方法,每个方法只需要参数的一个子集。如果不小心,这可能会导致方法过多,但它也可以通过增加正交性来帮助减少方法数。例如,考虑
java.util.List
接口。它不提供在子列表中查找元素的第一个或最后一个索引的方法,这两个方法都需要三个参数。相反,它提供了subList
方法,该方法接受两个参数并返回子列表的视图。此方法可以与indexOf
orlastIndexOf
方法结合使用,每个方法都有一个参数,以产生所需的功能。此外,subList
方法可以与对实例进行操作的任何List
方法组合,以对子列表执行任意计算。生成的 API 具有非常高的功率重量比。
有人可能会争辩说它removeRange
没有那么多参数,因此可能不是这种处理的候选者,但鉴于有一种通过 调用的方法removeRange
,subList
没有理由List
用冗余方法混淆接口。
†</sup>AbstractList.removeRange
文档说:
此方法由
clear
对该列表及其子列表的操作调用。重写此方法以利用列表实现的内部结构可以显着提高clear
对该列表及其子列表的操作性能。
另请参阅 OpenJDK 的AbstractList.clear
和实现SubList.removeRange
。