什么Java的AbstractList中的removeRange

什么Java的AbstractList中的removeRange

本文介绍了为什么Java的AbstractList中的removeRange()方法保护?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

没有人有任何想法,的为什么的中的(也在 )是保护?它看起来像一个非常明确和有用的操作,不过,使用它,我们不得不子类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文件说:

这方法是由所谓清晰这个名单及其子列表上的操作。重写此方法,以便在列表实现的内部的优点是可以的大幅的改善明确操作的列表和其子列表上的表现。

此外,请参阅的OpenJDK的实施<$c$c>AbstractList.clear和<$c$c>SubList.removeRange.

Also, see OpenJDK's implementation of AbstractList.clear and SubList.removeRange.

这篇关于为什么Java的AbstractList中的removeRange()方法保护?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-22 17:27