为什么Java';s摘要列表';s removeRange()方法是否受保护?
有人知道为什么中(以及中)的removeRange方法受保护吗?它看起来是一个定义良好且非常有用的操作,但为了使用它,我们不得不对列表实现进行子类化为什么Java';s摘要列表';s removeRange()方法是否受保护?,java,list,collections,arraylist,protected,Java,List,Collections,Arraylist,Protected,有人知道为什么中(以及中)的removeRange方法受保护吗?它看起来是一个定义良好且非常有用的操作,但为了使用它,我们不得不对列表实现进行子类化 是否有一些隐藏的理由?对我来说似乎很难理解。是的,因为这不是从外部代码中删除范围的方式。相反,请执行以下操作: list.subList(start, end).clear(); 这实际上是在幕后调用removeRange。† OP询问为什么removeRange不是列表公共API的一部分。原因见有效Java第二版第40项,我在此引用: 缩短过
是否有一些隐藏的理由?对我来说似乎很难理解。是的,因为这不是从外部代码中删除范围的方式。相反,请执行以下操作:
list.subList(start, end).clear();
这实际上是在幕后调用removeRange
。†
OP询问为什么
removeRange
不是列表
公共API的一部分。原因见有效Java第二版第40项,我在此引用:
缩短过长的参数列表有三种方法。一种是将方法分解为多个方法,每个方法只需要参数的子集。如果不小心这样做,可能会导致太多的方法,但它也可以通过增加正交性来帮助减少方法计数。例如,考虑<代码> java .UTI.List接口。它不提供在子列表中查找元素的第一个或最后一个索引的方法,这两个方法都需要三个参数。相反,它提供了子列表
方法,该方法接受两个参数并返回子列表的视图。此方法可以与indexOf
或lastIndexOf
方法结合使用,每个方法都有一个参数,以产生所需的功能。此外,子列表
方法可以与对列表
实例进行操作的任何方法相结合,在子列表上执行任意计算。由此产生的API具有非常高的功率重量比
有人可能会争辩说,removeRange
没有那么多参数,因此可能不是这种处理的候选者,但是考虑到有一种方法可以通过子列表调用removeRange
,没有理由用冗余方法将列表
界面弄得乱七八糟
†文件说明:
此方法由此列表及其子列表上的clear
操作调用。重写此方法以利用列表实现的内部功能可以显著提高此列表及其子列表上的clear
操作的性能
另外,请参阅OpenJDK的和的实现。好的,可以这样做,但为什么?看起来很尴尬。单个元素可以直接从列表中删除,为什么不删除多个元素呢?@Joonas:effectivejava第二版第40项描述了这一点的基本原理。如果你没有这本书,我会把它粘贴到相关的部分。然而,仅仅因为给出了一个理由并不意味着它是有意义的。缩短参数列表的过程阻碍了开发人员理解API中可用操作的能力,这直接违背了列表最初被缩短的原因。这对于java来说非常典型。让我们将其设置为最复杂和最无效的。作为补充说明,您是否注意到当ArrayList
版本在列表末尾之前的范围内使用时,removeRange
会不必要地调用arraycopy
?numMoved
为0,因此如果(如remove
中所述),则可以将整个阵列复制代码放入单个;区别在于a)arraycopy是本机调用,会产生开销;b)arraycopy总是检查参数的正确性