【问题标题】:Why is removeRange(int fromIndex, int toIndex) in Java Vector is protected?为什么 Java Vector 中的 removeRange(int fromIndex, int toIndex) 受到保护?
【发布时间】:2020-12-01 12:36:26
【问题描述】:

谁能解释一下为什么 Java Vector 中的 removeRange(int fromIndex, int toIndex) 受到保护?

语法 - protected synchronized void removeRange(int fromIndex, int toIndex)

我研究了一些博客并做了一些代码来理解,但这里的事情并不是很清楚。我查看了 Vector.java 内部并试图建立一些理解。但我的总体看法是removeRange(int fromIndex, int toIndex) 最终会被删除。

我觉得sublist(int fromIndex, int toIndex).clear() 有能力做同样的工作。从实现和可用性的角度来看,看起来更贴切。

如果您有更好的想法,请帮助理解。

【问题讨论】:

  • “但我的总体看法是removeRange(int fromIndex, int toIndex) 最终会被删除。”是什么让你认为它会?你为什么会期望它首先是public
  • 也许完全避免使用java.util.Vector。这通常不是最佳选择。
  • 永远不要使用Vector!请改用ArrayList
  • 当然,“sublist(int fromIndex, int toIndex).clear() 能够完成同样的工作”。它有能力做到这一点,因为有人已经实现了它。对于VectorAbstractList 的任何其他子类,例如ArrayList,它已通过受保护的方法实现。这比要求每个子类再次实现子列表要简单。
  • @Akshat 声明它protected 实现您将使用标准API,即sublist(fromIndex, toIndex).clear(),而不是使用此实现细节。

标签: java collections java-13


【解决方案1】:

它存在是因为它是从AbstractList.removeRange 继承而来的。在这个抽象基类中公开它的意图被记录为使子类能够提高clear()的性能:

此方法由对该列表及其子列表的清除操作调用。重写此方法以利用列表实现的内部结构可以显着提高此列表及其子列表的清除操作的性能。

此方法极不可能被删除,因为这将是一个主要的兼容性问题。

但是你是对的,作为这个类的用户,你应该坚持使用公共接口,受保护的方法对于实现子类最有用。


那么,为什么方法不公开呢?

List.subList 的 JavaDocs 告诉我们

此方法无需显式范围操作(通常存在于数组中的那种)。任何需要列表的操作都可以通过传递 subList 视图而不是整个列表来用作范围操作。例如,以下成语从列表中删除一系列元素:

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

因此,在公共界面中不包括范围操作是经过深思熟虑的设计选择。在任何List 实现中,这些操作都可以通过调用子列表视图的操作来执行。

【讨论】:

  • 我看到AbstractList.removeRange 一直受到保护,因此当 Vector 类覆盖它时,它也可以公开。但相反,它被保持为受保护的状态。您提到的提高clear() 性能的要点,我也在AbstractList 中阅读过。我观察到 Vector 有自己的 clear() 调用 removeAllElements()
  • @Holger,对不起,我重新发表了评论。
  • @Hulk 我喜欢这种推理。而removeRange(int fromIndex, int toIndex) 不是 LinkedList 的一部分可能是有原因的。我从来没有考虑过。
  • @Hulk - 所以这是“设计使然”,我以前听说过;)
  • @Hulk 和 Holger,感谢您的时间和指导。真的很感激:)
猜你喜欢
  • 2011-01-18
  • 2023-01-20
  • 1970-01-01
  • 2015-06-11
  • 2020-07-15
  • 1970-01-01
  • 2020-12-27
  • 2022-08-07
  • 2019-09-06
相关资源
最近更新 更多