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