问题描述
没有人有任何想法,的为什么的中的(也在 )是保护
?它看起来像一个非常明确和有用的操作,不过,使用它,我们不得不子类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.
推荐答案
是的,因为这不是你如何删除从外面code的范围。相反,这样做:
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
不是列表
公共API的一部分。究其原因,在有效的Java第二版的第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
接口。它没有提供方法来查找一个元件的第一或最后索引在子列表,两者都将需要三个参数。相反,它提供了子列表
方法,它有两个参数,并返回一个子表的的视图的。这种方法可以用的indexOf
或 lastIndexOf
方法,其中每一个有一个单一的参数,以得到所需的组合功能。此外,子列表
方法可以结合的上一个列表
实例运行任何的方法在子列表执行任意的计算。所得的API具有非常高的功率重量比。
有人可能会说 removeRange
没有很多的参数,因此可能不适合这种治疗的候选人,但考虑到有一种方法来调用 removeRange
通过子列表
,没有任何理由扰乱了列表
接口与冗余的方法。
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.
的<$c$c>AbstractList.removeRange$c$c>文件说:
这方法是由所谓清晰
这个名单及其子列表上的操作。重写此方法,以便在列表实现的内部的优点是可以的大幅的改善明确
操作的列表和其子列表上的表现。
此外,请参阅的OpenJDK的实施<$c$c>AbstractList.clear$c$c>和<$c$c>SubList.removeRange$c$c>.
Also, see OpenJDK's implementation of AbstractList.clear
and SubList.removeRange
.
这篇关于为什么Java的AbstractList中的removeRange()方法保护?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!