问题描述
有谁知道为什么AbstractList(也在 ArrayList) 是 protected
吗?它看起来是一个定义明确且有用的操作,但为了使用它,我们仍然不得不对 List 实现进行子类化.
Does anyone have any idea, why removeRange method in AbstractList (and also in ArrayList) is protected
? It looks like a quite well-defined and useful operation, but still, to use it, we're forced to subclass the List implementation.
有什么隐藏的理由吗?对我来说似乎很莫名其妙.
Is there some hidden rationale? Seems quite inexplicable to me.
推荐答案
是的,因为这不是从外部代码中删除范围的方式.相反,请执行以下操作:
Yes, because that's not how you remove a range from outside code. Instead, do this:
list.subList(start, end).clear();
这实际上在幕后调用了removeRange
.
This actually calls removeRange
behind the scenes.
OP 询问为什么 removeRange
不是 List
公共 API 的一部分.原因在 Effective Java 2nd ed 的 Item 40 中有描述,我在这里引用:
The OP asks why removeRange
is not part of the List
public API. The reason is described in Item 40 of Effective Java 2nd ed, and I quote it here:
有三种技术可以缩短过长的参数列表.一种是将方法分解为多个方法,每个方法只需要参数的一个子集.如果粗心大意,这可能会导致方法过多,但它也可以通过增加正交性来帮助减少方法数量.例如,考虑 java.util.List
接口.它不提供在子列表中查找元素的第一个或最后一个索引的方法,这两者都需要三个参数.相反,它提供了 subList
方法,该方法接受两个参数并返回子列表的 view.此方法可以与 indexOf
或 lastIndexOf
方法结合使用,每个方法都有一个参数,以产生所需的功能.此外,subList
方法可以与在 List
实例上操作的any 方法结合,以对子列表执行任意计算.由此产生的 API 具有非常高的功率重量比.
有人可能会争辩说 removeRange
没有那么多参数,因此可能不是这种处理的候选者,但鉴于有一种方法可以通过调用 removeRange
subList
,没有理由用多余的方法把 List
接口弄乱.
One can argue that removeRange
doesn't have that many parameters and is therefore probably not a candidate for this treatment, but given that there's a way to invoke removeRange
through the subList
, there is no reason to clutter up the List
interface with a redundant method.
此方法由对该列表及其子列表的 clear
操作调用.重写此方法以利用列表实现的内部结构可以显着提高对该列表及其子列表的 clear
操作的性能.
另外,参见 OpenJDK 对 AbstractList.clear
和 SubList.removeRange
.
Also, see OpenJDK's implementation of AbstractList.clear
and SubList.removeRange
.
这篇关于为什么 Java 的 AbstractList 的 removeRange() 方法受到保护?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!