为什么没有"?;List.reverse();Java中的方法?
在Java中,要反转列表中的元素,我需要使用:为什么没有"?;List.reverse();Java中的方法?,java,list,oop,interface,Java,List,Oop,Interface,在Java中,要反转列表中的元素,我需要使用: Collections.reverse(list) 我只是想知道为什么Java没有在List接口中实现reverse方法,这样我就可以像这样进行就地反转: list.reverse() 有人对此有什么想法吗 为什么Java中没有List.reverse()方法 因为有一个Collections.reverse(List)方法 因为API设计师认为强制每个列表实现1实现一个99.9%时间都没有使用的方法2是个坏主意。这可以通过使方法“可选”来解决
Collections.reverse(list)
我只是想知道为什么Java没有在List
接口中实现reverse方法,这样我就可以像这样进行就地反转:
list.reverse()
有人对此有什么想法吗
为什么Java中没有List.reverse()
方法
因为有一个Collections.reverse(List)
方法
因为API设计师认为强制每个列表实现1实现一个99.9%时间都没有使用的方法2是个坏主意。这可以通过使方法“可选”来解决,但这也有缺点;e、 g.运行时异常
因为对于某些类型的列表(例如流包装器/适配器),实现就地反转会有问题。它通过要求对列表进行具体化来更改其内存使用特性
还要注意,Collection
提供的reverse()
的通用实现()使用set
交换元素。对于标准列表类型来说,它接近最优
@shmosel评论:
我想OP是在问为什么它没有像List.sort()那样作为默认方法添加
说得好。可能99.9%的论点适用。请记住,这只会帮助那些使用Java8或更高版本编译器等构建代码库的人
1-这包括代码库和第三方库中的实现
2-86%的统计数据用于戏剧效果:-)如果您需要list.reverse()。在JDK列表中,很多方法(如sort、max、min)都没有添加
这是两种不同的API设计方式:
在Collection->rich Collection->Eclipse中有很多方法
集合,缺点:列表中有很多很少使用的方法
只有最常用的方法和实用程序类->JDK
集合,缺点:需要使用类似集合的实用类
因为收藏
是一个功利类,它实际上基于一个原则:
S-单一责任原则
这个原则表明,如果我们有两个理由改变一个类,我们必须将功能分成两个类
你有一个类扮演着某种角色,如果你需要操纵内部数据,你需要创建一些附属类,它将扮演另一个角色。出于同样的原因,列表
界面中没有声明和无限多可能的列表函数。它们不是“列表”抽象的一部分;相反,它们可以在该抽象之上实现
一旦列表
实现了列表
界面中已有的方法,就可以在列表
抽象之上编写一个反向
函数,而不必了解特定的列表
实现。因此,强制实现<代码>列表<代码>的每个类提供<代码>反向<代码>(和<代码>填充<代码>,<代码>旋转<代码>,<代码>洗牌<代码>,<代码>交换<代码>,等等)的自定义实现是毫无意义的。这不是集合层次结构的一部分,而是作为可用于不同列表的实用程序类的一部分提供的
反转列表并不是定义列表的关键部分,所以它不在接口中,而是单独给出的。如果在接口中定义,每个人都必须实现它,这可能不适合所有人
集合的制作者也可以在列表层次结构中构建它(因为大多数列表派生在两者之间有一个抽象类,所以他们可以将它放在两者之间的任何抽象类中)。然而,为了简化每个人的生活,把它放在一个实用程序类中是有意义的,这样我们就不必弄清楚哪一个类来查找所有与集合相关的实用函数。 注释:这个问题是一个非常具体的情况,人们甚至可以把它看作是一个副本。除此之外,关于每种方法的决策背后的推理的争论是阅读茶叶,没有人能说出
反向方法的特定情况下设计决策的“原因”(直到,也许Josh Bloch在这里给出答案)。有趣的是,这一点并没有在
其他一些答案乍一看似乎令人信服,但也提出了其他问题。特别是,其中一些根本没有给出设计决策的理由。即使有其他方法来模拟某个方法的行为,或者当某个方法“99.9%的时间”未被使用时,将其包含在接口中仍然是有意义的
查看列表
界面,您会发现基本上可以基于其他两种方法实现所有方法:
T获取(整数索引)
int size()
(对于可变列表,您还需要设置
)。这些正是在AbstractList
中仍然是抽象的。因此,所有其他方法都是相当“方便”的方法,可以基于这两种方法规范地实现。在这方面,我认为这包含了一个重要的观点:有人可能会提出要实现几十种其他方法。当然,这样做是有充分理由的。查看集合的实际实现#反向(列表)
:
然后这是一个strong标志,表明这实际上应该是一个多态方法,应该为特殊类型实现相应的多态方法
因此,是的,我们有理由取消这项计划
public static void reverse(List<?> list) {
int size = list.size();
if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)
swap(list, i, j);
} else {
ListIterator fwd = list.listIterator();
ListIterator rev = list.listIterator(size);
for (int i=0, mid=list.size()>>1; i<mid; i++) {
Object tmp = fwd.next();
fwd.set(rev.previous());
rev.set(tmp);
}
}
}
void doSomethingWith(Type x) {
if (x instanceof Special) doSomethingSpecial((Special)x);
else doSomethingNormal(x);
}
Collections.containsAll(containing, others);