有谁知道, 为什么
AbstractList
(以及ArrayList)中的removeRange方法是protected
?它看起来像是一个定义明确且有用的操作,但是仍然要使用它,我们不得不对List实现进行子类化。
有一些隐藏的理由吗?对我来说似乎莫名其妙。
是的,因为这不是您从外部代码中删除范围的方式。相反,请执行以下操作:
list.subList(start, end).clear();
这实际上removeRange
是在幕后。†
OP询问为什么removeRange
不属于List
公共API。原因在《有效Java第二版》的第40条中进行了描述,在此引用:
有三种缩短简短参数列表的技术。一种是将方法分解为多种方法,每种方法仅需要一部分参数。如果不小心进行,可能会导致方法过多,但也可能通过增加正交性来帮助
减少
方法数量。例如,考虑java.util.List
接口。它没有提供在子列表中查找元素的第一个索引或最后一个索引的方法,这两个方法都需要三个参数。而是提供了subList
方法,该方法带有两个参数并返回子列表的
视图
。此方法可以与indexOf
或lastIndexOf
方法结合使用,以产生所需的功能,每个方法都具有一个参数。而且,subList
方法可以与对实例进行操作的
任何 方法组合以List
对子列表执行任意计算。所得的API具有非常高的功率重量比。
可以说removeRange
没有那么多参数,因此可能不适合使用这种方法,但是鉴于有一种方法可以removeRange
通过调用subList
,因此没有理由List
用冗余方法来弄乱接口。
†该AbstractList.removeRange
文件说:
此方法由
clear
对此列表及其子列表的操作调用。重写此方法以利用列表实现的内部功能可以 大大 改善clear
此列表及其子列表上操作的性能。
另外,请参见OpenJDK的AbstractList.clear
和的实现SubList.removeRange
。
问题内容: 出于好奇, 为什么将方法的访问修饰符设置为。为什么不能呢?有人可以向我解释这背后的任何具体原因吗? 另外,我知道该方法仅被调用一次。如果我在程序内部两次调用它,会发生什么情况?垃圾收集器会再次调用吗? 问题答案: 我用另一个问题回答您的问题: 为什么方法不应该受到保护? 通常,您应该尝试使事物尽可能私密。这就是封装的全部意义所在。否则,您 什么都 可以做。不能(因为派生类应该能够访问它
问题内容: 定义为的受保护的具体原因是什么? 问题答案: 克隆受到保护的事实非常令人怀疑-事实是该clone方法未在Cloneable接口中声明。 它使该方法对于获取数据副本非常无用,因为你不能说: 我认为,Cloneable现在的设计在很大程度上被认为是一个错误(以下引用)。我通常希望能够实现接口的实现,Cloneable但不一定要实现接口Cloneable(类似于的使用Serializable
问题内容: 当我用方法覆盖方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法? 问题答案: 子类始终可以扩大访问修饰符,因为它仍然是超类的有效替代。从Java规范中有关覆盖和隐藏的需求: 覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与覆盖或隐藏方法相同的访问权限,如下所示: 如果覆盖或隐藏方法是公共的,则覆盖或隐藏方法必须是公共的;否则,将发
我熟悉。正如我在spring文档http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/aop.html中看到的,基于代理的概念。 在8.2.3.1支持的切入点指定器部分中,我发现了下面的注释 由于Spring的AOP框架的基于代理的性质,受保护的方法根据定义是不被拦截的,对于JDK代理(如果这不适用)和CGL
问题内容: 在Java中,为什么不能在接口中使用受保护的方法? 由于根据Java规范 受保护的访问(由关键字protected表示)-同一包中任何类型以及任何包中的子类均可访问的字段或方法。 如果我必须使用该接口,那么我将实现它并覆盖方法。因此,如果我要实现类可以访问这些方法的位置,因为该方法可以在任何包中访问。那么,将方法声明为Interface中的保护有什么害处? 问题答案: 受保护的方法旨在
本文向大家介绍Java中AbstractList类的listIterator()方法,包括了Java中AbstractList类的listIterator()方法的使用技巧和注意事项,需要的朋友参考一下 Java中的AbstractList类的方法用于在此列表中的元素上返回列表迭代器。 语法如下。 在这里,ListIterator <E>是列表的迭代器。 要使用AbstractList类,请导入以