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

2022-08-31 09:26:14

有没有人知道,为什么DemoveRange方法在抽象列表(以及数组列表中)是?它看起来像一个非常明确且有用的操作,但是,为了使用它,我们被迫对List实现进行子类化。protected

有没有一些隐藏的理由?对我来说似乎很莫名其妙。


答案 1

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

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

这实际上叫幕后。removeRange


OP 询问为什么不是公共 API 的一部分。原因在有效Java第2版的第40项中进行了描述,我在这里引用它:removeRangeList

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

有人可能会争辩说,它没有那么多参数,因此可能不是这种处理的候选者,但是考虑到有一种方法可以通过调用,没有理由用冗余方法使接口混乱。removeRangeremoveRangesubListList


AbstractList.removeRange 文档说:

此方法由对此列表及其子列表的操作调用。重写此方法以利用列表实现的内部功能可以显著提高对此列表及其子列表的操作的性能。clearclear

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


答案 2