为什么 Java Vector 类中的 removeRange(int fromIndex, int toIndex) 方法是受保护的?

3
有人能解释一下为什么Java Vector中的removeRange(int fromIndex, int toIndex)是protected吗?
语法 - protected synchronized void removeRange(int fromIndex, int toIndex) 我阅读了一些博客并编写了一些代码来理解,但这里的情况并不是很清楚。我查看了Vector.java并尝试创建一些理解。但我的总体印象是removeRange(int fromIndex, int toIndex)最终会被删除。
我认为sublist(int fromIndex, int toIndex).clear()可以胜任同样的工作。从实现和可用性的角度看,这似乎更合适。
如果您有更好的想法,请帮忙理解。

5
“但我总体的看法是,removeRange(int fromIndex, int toIndex) 最终将被移除。”你为什么认为它会被移除?并且为什么你一开始就期望它是public的呢? - Federico klez Culloca
4
最好避免使用java.util.Vector。通常不是最佳选项。 - khelwood
永远不要使用“Vector”!请改用“ArrayList”。 - fps
1
当然,“sublist(int fromIndex, int toIndex).clear()也能完成同样的工作”。它之所以能够这样做,是因为有人已经实现了它。对于 Vector 或任何其他 AbstractList 的子类,例如 ArrayList,都是通过该受保护的方法来实现的。这比要求每个子类再次实现子列表更简单。 - Holger
2
声明为protected可以实现使用标准API,即sublist(fromIndex, toIndex).clear(),而不是使用此实现细节。 - Holger
显示剩余4条评论
1个回答

6
它存在是因为它从AbstractList.removeRange继承而来。在此抽象基类中公开它的意图是为了使子类能够改善clear()的性能, 这一点已经有文档记录:

清除列表及其子列表时,该方法会被调用。重写此方法以利用列表实现的内部机制可以大大提高清除操作在该列表及其子列表上的性能。

几乎不可能删除此方法,因为这将是一个重大的兼容性问题。
但您是正确的,作为此类的用户,您应该坚持使用公共接口,受保护的方法主要用于实现子类。
所以,为什么这个方法没有公开? List.subList 的 JavaDocs 告诉我们:

This method eliminates the need for explicit range operations (of the sort that commonly exist for arrays). Any operation that expects a list can be used as a range operation by passing a subList view instead of a whole list. For example, the following idiom removes a range of elements from a list:

 list.subList(from, to).clear();

因此,在公共接口中不包括范围操作是一个有意的设计选择。在任何 List 实现上,这些操作都可以通过调用子列表视图上的操作来执行。


我看到AbstractList.removeRange被保留为protected,所以当Vector类覆盖它时,它也可以被设置为public。但是,它仍然被保留为protected。你提到的改进clear()性能的重点,我在AbstractList中也读到了。我观察到Vector有自己的clear(),它调用removeAllElements() - Xat
@Holger,抱歉我重新编辑了我的评论。 - Xat
@ Hulk 我喜欢你的推理。而且 removeRange(int fromIndex, int toIndex) 不是 LinkedList 的一部分,也许有它的原因。我从来没有想过这个问题。 - Xat
@Hulk - 所以这是“按设计”,我以前听过这个说法 ;) - Xat
@ Hulk 和 Holger,感谢你们的时间和指导。非常感激 :) - Xat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接