列表与ArrayList作为参考types?

好,所以我知道SetListMap是接口,但是什么使第一行代码比第二行更好呢?

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

如果你使用第一种forms,你会说你将要使用的是List接口的function – 没有别的,特别是没有任何额外的实现。 这意味着您可以轻松更改所使用的实现(例如,在实例化中只需将LinkedListreplace为ArrayList ),而不必担心会破坏代码的其余部分,因为您可能已经使用了ArrayList特定的内容。

有关编程中types的有用的一般原则(有时称为鲁棒性原则 )如下:

  • 对于你所接受的事情要自由
  • 保守你的排放

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

明确使用ArrayList作为types(您的第二种情况)的主要原因是您需要使用ArrayList特有的方法,这些方法通过List接口不可用。 在这种情况下,通用列表将不起作用(除非你想做很多丑陋和混淆的转换),所以你可以直接使用ArrayList。 这给读者提供了需要ArrayList的特定function的额外好处。

ArrayList的源代码可以看出,大部分实现的方法都被注解为@override因为所有的这些方法都是通过List接口定义的,所以如果你要使用基本的function(这就是你最想做的事情的时间)差异将不会有任何实际的。

如果有一天你会认为ArrayList的特性不适合你的问题,你将需要一些不同的东西(例如LinkedList )。 如果你声明一切为List但是实例化为ArrayList你可以很容易地通过改变实例化到new ArrayList()来切换到新的实现,而在其他情况下,你将不得不改变所有的variables声明。

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