列表与ArrayList作为参考类型?

时间:2010-10-31 11:57:07

标签: java list arraylist interface

好的,我知道SetListMap是接口但是第一行代码比第二行更好吗?

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

3 个答案:

答案 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样式,因为您声明您不关心列表的特定实现,并且您想要丢弃有关该类型的静态信息,因为您将依赖于提供的接口通过这种集合从其实现中抽象出来。