好,所以我知道Set
,List
和Map
是接口,但是什么使得第一行代码比第二行更好?列表与ArrayList作为引用类型?
List myArr = new ArrayList();
ArrayList myArr = new ArrayList();
好,所以我知道Set
,List
和Map
是接口,但是什么使得第一行代码比第二行更好?列表与ArrayList作为引用类型?
List myArr = new ArrayList();
ArrayList myArr = new ArrayList();
如果使用第一种形式,你说你曾经打算使用所有在List
界面的功能 - 不出意外,尤其是没有额外的由它执行任何添加。这意味着您可以轻松更改所使用的实现(例如,只需在实例化中将LinkedList
替换为ArrayList
),而不用担心会破坏代码的其余部分,因为您可能使用了特定于ArrayList
的某些内容。
我认为当你提到在一个Collections.checkedList()中包装你的ArrayList以进行调试时,情况会更加引人注目。当你提到LinkedList时,人们会说“为什么我会使用LinkedList?”。 – ILMTitan 2010-11-01 15:50:43
@ILMTitan:同意。这是比不必切换到“LinkedList”更常见的情况。但'LinkedList'也很有用,当我需要在开始时进行大量的添加/删除操作时,我不得不切换到使用它们。这里的要点是将实现和接口分开,以便可以更改实现,而不必对其余代码进行大量更改。 – MAK 2010-11-01 16:33:03
正如你可以从ArrayList
here来源看,大部分的实施注释为@override
的方法,因为所有的人都认为通过List
接口定义,因此,如果你要使用只是基本功能(也就是你是什么会在大部分时间里完成),这种差异不会有实际意义。
如果有一天您会认为ArrayList
的功能不再适合您的问题,并且您需要不同的东西(例如LinkedList
),那么就会出现差异。如果您声明所有内容为List
,但实例化为ArrayList
,则可以通过将实例更改为new ArrayList()
来轻松切换到新实现,而在其他情况下,您将不得不更改所有变量声明。
使用List list = new ArrayList()
是更多的OOP风格,因为您声明您不关心列表的具体实现,并且您想放弃有关该类型的静态信息,因为您将依赖此类提供的接口集合从其实现中抽象出来。
关于编程类型(有时简称为robustness principle)一个有用的一般原则如下:
列表比ArrayList更自由,因为List可以是任何种类的List实现,例如ArrayList,LinkedList或FrancosSpecialList。因此,自由派和接受任何类型的名单是一个好主意,因为您可能想稍后改变实施。
将ArrayList明确用作类型(您的第二种情况)的主要原因是您需要使用通过List接口不可用的ArrayList特有的方法。在这种情况下,通用列表将不起作用(除非你想做大量丑陋和令人困惑的投射),所以你可以直接使用ArrayList。这为读者提供了需要ArrayList的特定功能的额外好处。
第二行比较好,因为ArrayList类型除了List之外还提供了更多的功能。但是,当您执行不依赖于List实现的代码时,List类型会更好。请覆盖我的[ArrayList的内部生活](http://volodial.blogspot.com/2013/07/internal-life-of-arraylist-in-java.html)以深入了解它。 – 2013-08-05 14:13:46