3

任何人都可以阐明为什么removeRange(int fromIndex, int toIndex)在 Java Vector 中受到保护?

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

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

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

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

4

1 回答 1

6

它在那里是因为它是继承的形式AbstractList.removeRange。在此抽象基类中公开它的意图被记录为使子类能够提高以下性能clear()

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

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

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


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

List.subList用于告诉我们的 JavaDocs

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

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

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

于 2020-12-01T13:01:50.263 回答