Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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
Java 为什么人们会创建这样的arraylist?_Java - Fatal编程技术网

Java 为什么人们会创建这样的arraylist?

Java 为什么人们会创建这样的arraylist?,java,Java,偶尔我会看到有人创建这样的arraylist,为什么 List numbers = new ArrayList( ); 而不是: ArrayList<something> numbers = new ArrayList<something>(); ArrayList number=new ArrayList(); 两个区别是第一行中的数字属于列表,而不是数组列表。这是可能的,因为ArrayList是List的后代;也就是说,它拥有List所拥有的一切,因此可以填充L

偶尔我会看到有人创建这样的arraylist,为什么

List numbers = new ArrayList(  );
而不是:

ArrayList<something> numbers = new ArrayList<something>();
ArrayList number=new ArrayList();

两个区别是第一行中的
数字属于
列表
,而不是
数组列表
。这是可能的,因为
ArrayList
List
的后代;也就是说,它拥有
List
所拥有的一切,因此可以填充
List
对象。(反过来说,这是行不通的。)


第二行的
ArrayList
已键入。这意味着第二个
数字
列表只能保存类型
某物
对象。

如果您要求使用接口而不是具体对象,那么这是一个很好的做法。想象一下,明天您将切换到
LinkedList
。在第一种情况下,您不需要修复变量声明

如果问题是关于不使用泛型,那么它是不好的。泛型总是好的,因为它们提供了类型安全性。

有一天你可以做到:
列表编号=新建LinkedList()在不更改客户端代码的情况下调用
数字

声明接口而不是实现确实是相当好和普遍的做法,但它并不总是最好的方法。除非以下所有条件均为真,否则每次都使用它:

  • 您完全确信,所选择的实现将满足您的需求
  • 您需要一些特定于实现的feauture,这是通过接口无法获得的,例如,
    ArrayList.trimToSize()
当然,您可以使用强制转换,但是使用接口毫无意义。

第一行是老式Java,我们必须在Java1.5引入泛型之前完成。但许多优秀的软件工程师仍然被迫使用Java1.4(或更低版本),因为他们的公司担心升级应用程序的风险和努力

好的,那是没有记录的。许多遗留代码是使用Java1.4或更低版本生成的,并且没有经过重构

第二行包括泛型(显然是1.5+),变量声明为
ArrayList
。其实没什么大问题。当然,最好是针对接口编写代码,因此在我(和其他人)看来,不要将变量声明为
ArrayList
,除非您确实需要特殊的
ArrayList
方法。

什么好: 1.列表是许多实现的一般情况

List trololo = new ListImpl();
  • 隐藏用户的实际实现:

    公共列表{ List trololo=new somecoollistempl(); 返回特罗洛; }

  • 从设计上看,这很好:用户不应该关注实现。他只是获得了实现的接口访问权。实现应该已经有了所有必要的属性:快速添加、快速插入或不可修改,例如

    坏的是: 我已经了解到,所有原始类型都将在未来的Java版本中受到限制,因此这样的代码最好以这种方式编写:

    List<?> trololo = new ListImpl<?>();
    
    List trololo=new listinpl();
    

    一般来说,通配符具有相同的含义:您不知道您的集合是异构的还是异构的?

    大多数时候,当您不关心实现时,最好是编程到接口。比如说:

    List<something> numbers = new ArrayList<something>();
    
    List number=new ArrayList();
    
    优先于:

    ArrayList<something> numbers = new ArrayList<something>();
    
    ArrayList number=new ArrayList();
    
    原因是,出于性能原因,您可以稍后调整程序

    但是,您必须小心,不要只选择最通用的接口。例如,如果您希望有一个排序集,而不是设置为排序集,则应编程为排序集,如下所示:

    SortedSet<something> s = new TreeSet<something>();
    
    Set<something> s = new TreeSet<something>();
    
    SortedSet s=新树集();
    
    如果您只是公然使用这样的界面:

    SortedSet<something> s = new TreeSet<something>();
    
    Set<something> s = new TreeSet<something>();
    
    Set s=new TreeSet();
    
    有人可以将实现修改为HashSet,您的程序将被破坏


    最后,当您定义公共API时,这个程序到接口将更加有用

    以前,没有泛型(JDK 65和更高版本引入了泛型),所以使用了示例代码的版本1(只是一个旁注)。