2010-10-31 43 views
20

好,所以我知道Set,ListMap是接口,但是什么使得第一行代码比第二行更好?列表与ArrayList作为引用类型?

List myArr = new ArrayList(); 
ArrayList myArr = new ArrayList(); 
+0

第二行比较好,因为ArrayList类型除了List之外还提供了更多的功能。但是,当您执行不依赖于List实现的代码时,List类型会更好。请覆盖我的[ArrayList的内部生活](http://volodial.blogspot.com/2013/07/internal-life-of-arraylist-in-java.html)以深入了解它。 – 2013-08-05 14:13:46

回答

32

如果使用第一种形式,你说你曾经打算使用所有在List界面的功能 - 不出意外,尤其是没有额外的由它执行任何添加。这意味着您可以轻松更改所使用的实现(例如,只需在实例化中将LinkedList替换为ArrayList),而不用担心会破坏代码的其余部分,因为您可能使用了特定于ArrayList的某些内容。

+2

我认为当你提到在一个Collections.checkedList()中包装你的ArrayList以进行调试时,情况会更加引人注目。当你提到LinkedList时,人们会说“为什么我会使用LinkedList?”。 – ILMTitan 2010-11-01 15:50:43

+1

@ILMTitan:同意。这是比不必切换到“LinkedList”更常见的情况。但'LinkedList'也很有用,当我需要在开始时进行大量的添加/删除操作时,我不得不切换到使用它们。这里的要点是将实现和接口分开,以便可以更改实现,而不必对其余代码进行大量更改。 – MAK 2010-11-01 16:33:03

6

正如你可以从ArrayListhere来源看,大部分的实施注释为@override的方法,因为所有的人都认为通过List接口定义,因此,如果你要使用只是基本功能(也就是你是什么会在大部分时间里完成),这种差异不会有实际意义。

如果有一天您会认为ArrayList的功能不再适合您的问题,并且您需要不同的东西(例如LinkedList),那么就会出现差异。如果您声明所有内容为List,但实例化为ArrayList,则可以通过将实例更改为new ArrayList()来轻松切换到新实现,而在其他情况下,您将不得不更改所有变量声明。

使用List list = new ArrayList()是更多的OOP风格,因为您声明您不关心列表的具体实现,并且您想放弃有关该类型的静态信息,因为您将依赖此类提供的接口集合从其实现中抽象出来。

10

关于编程类型(有时简称为robustness principle)一个有用的一般原则如下:

  • 起人来你接受
  • 要保守你发出什么
什么

列表比ArrayList更自由,因为List可以是任何种类的List实现,例如ArrayList,LinkedList或FrancosSpecialList。因此,自由派和接受任何类型的名单是一个好主意,因为您可能想稍后改变实施。

将ArrayList明确用作类型(您的第二种情况)的主要原因是您需要使用通过List接口不可用的ArrayList特有的方法。在这种情况下,通用列表将不起作用(除非你想做大量丑陋和令人困惑的投射),所以你可以直接使用ArrayList。这为读者提供了需要ArrayList的特定功能的额外好处。

相关问题