Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么没有"?;List.reverse();Java中的方法?_Java_List_Oop_Interface - Fatal编程技术网

为什么没有"?;List.reverse();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是个坏主意。这可以通过使方法“可选”来解决

在Java中,要反转列表中的元素,我需要使用:

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);