111

有谁知道,为什么AbstractList(以及ArrayList)中的removeRange 方法是protected?它看起来像是一个定义明确且有用的操作,但仍然要使用它,我们不得不继承 List 实现。

有什么隐藏的理由吗?对我来说似乎很莫名其妙。

4

1 回答 1

179

是的,因为这不是您从外部代码中删除范围的方式。相反,请执行以下操作:

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

removeRange这实际上是在幕后调用。†</sup>


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

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

有人可能会争辩说它removeRange没有那么多参数,因此可能不是这种处理的候选者,但鉴于有一种通过 调用的方法removeRangesubList没有理由List用冗余方法混淆接口。


†</sup>AbstractList.removeRange文档说:

此方法由clear对该列表及其子列表的操作调用。重写此方法以利用列表实现的内部结构可以显着提高clear对该列表及其子列表的操作性能。

另请参阅 OpenJDK 的AbstractList.clear和实现SubList.removeRange

于 2010-02-18T14:16:42.410 回答