好的,我知道Set
,List
和Map
是接口但是第一行代码比第二行更好吗?
List myArr = new ArrayList();
ArrayList myArr = new ArrayList();
答案 0 :(得分:33)
如果您使用第一个表单,则表示您将要使用的是List
接口的功能 - 没有其他任何内容,尤其是任何实现都不会增加额外的内容。这意味着您可以轻松更改所使用的实现(例如,只需在实例化中替换LinkedList
for ArrayList
),而不必担心它会破坏其余代码,因为您可能使用了特定于{{{ 1}}。
答案 1 :(得分:11)
有关编程类型的有用一般原则(有时称为robustness principle)如下:
List比ArrayList更自由,因为List可以是任何类型的List实现,例如ArrayList,LinkedList或FrancosSpecialList。因此,自由主义并接受任何类型的列表是个好主意,因为您可能希望稍后更改实现。
将ArrayList显式用作类型(第二种情况)的主要原因是,如果需要使用特定于ArrayList的方法,这些方法不能通过List接口使用。在这种情况下,通用List将不起作用(除非你想做很多丑陋和令人困惑的转换),所以你也可以显式并直接使用ArrayList。这有一个额外的好处,即向读者暗示需要ArrayList的特定功能。
答案 2 :(得分:6)
从ArrayList
here的来源可以看出,实施的大多数方法都注释为@override
,因为所有这些方法都是通过List
接口定义的如果你要使用基本的功能(这是你大部分时间都要做的),那么差异将不是任何实际的。
如果有一天您认为ArrayList
的功能不再适用于您的问题并且您需要不同的东西(例如LinkedList
),那么差异就会出现。如果您将所有内容声明为List
但实例化为ArrayList
,则可以通过将实例化更改为new ArrayList()
轻松切换到新实现,而在其他情况下,您还必须更改所有变量声明。 / p>
使用List list = new ArrayList()
是更多OOP样式,因为您声明您不关心列表的特定实现,并且您想要丢弃有关该类型的静态信息,因为您将依赖于提供的接口通过这种集合从其实现中抽象出来。