2011-04-18 76 views
0

偶尔我会看到有人创建这样的数组列表,为什么?为什么人们会这样创建数组列表?

List numbers = new ArrayList(); 

代替:

ArrayList<something> numbers = new ArrayList<something>(); 
+0

之前,没有使用泛型(JDK 65和更高版本的泛型),因此使用示例代码的第1版(只是* sidenote *)。 – 2011-04-18 08:15:37

回答

2

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

List trololo = new ListImpl(); 
  1. 隐藏用户真正实现:

    公开名单giveMeTheList(){ 名单trololo =新SomeCoolListImpl(); return trololo; }

按设计很好:用户不应该注意实现。他只是获得实现的接口访问权限。实现应该已经具备了所有必要的属性:快速添加,快速插入或不可修改,e.t.c.

什么是坏: 我读过的所有原始类型都将在未来的Java版本的限制,所以这样的代码最好写是这样的:

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

一般来说通配符具有相同的含义:你不”你知道你的收藏是异质还是同质吗?

0

两个差别是在numbers第一行是类型List,不ArrayList的。这是可能的,因为ArrayListList的后裔;也就是说,它具有List所具有的一切,因此可以填充List对象。 (相反,这是行不通的。)

第二行的ArrayList被键入。这意味着第二个numbers列表只能保存类型something对象。

7

如果您问关于使用接口而不是具体对象,那么这是一个好习惯。想象一下,你明天将切换到LinkedList。在第一种情况下,您不需要修改变量声明。

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

1

有一天你可以这样做: List<something> numbers = new LinkedList<something>();无需更改客户端代码即可调用numbers

1

声明接口而不是实现确实是相当不错的和普遍的做法,但它不是总是最好的方法。除以下所有情况外,每次使用都是如此:

  • 您完全确定,选择的实施将满足您的需求。
  • 您需要一些特定于实现的特性,但不能通过接口获得,例如ArrayList.trimToSize()

当然,你可以使用cast,但是使用接口根本没有意义。

1

第一行是旧式 Java,我们不得不在Java 1.5之前推出仿制药。但是很多杰出的软件工程师仍然被迫使用Java 1.4(或更少),因为他们的公司担心风险和努力来升级应用程序......

好的,那已经是记录了。很多传统代码已经用java 1.4或更低版本生成,并没有被重构。

第二行包含泛型(显然1.5+),变量声明为ArrayList。其实没有什么大问题。当然,总是最好对接口进行编码,所以对我(和其他人)的意见,请不要将变量声明为ArrayList,除非您需要真的需要特殊的ArrayList方法。

1

大多数情况下,当您不关心实现时,最好编程为接口。所以,像这样:

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

将是首选比:

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

的原因是您以后可以调整你的程序性能的原因。

但是,你必须小心,不要只选择最通用的接口。例如,如果你想拥有一个有序集合,而不是向,则应通过编程来SortedSet的,像这样:

SortedSet<something> s = new TreeSet<something>(); 

如果你只是公然使用的界面是这样的:

Set<something> s = new TreeSet<something>(); 

有人可以修改执行到HashSet和您的程序将被打破。

最后,当你定义一个公共API时,这个接口程序甚至会更有用。

相关问题