列表与ArrayList作为参考types?
好,所以我知道Set
, List
和Map
是接口,但是什么使第一行代码比第二行更好呢?
List myArr = new ArrayList(); ArrayList myArr = new ArrayList();
如果你使用第一种forms,你会说你将要使用的是List
接口的function – 没有别的,特别是没有任何额外的实现。 这意味着您可以轻松更改所使用的实现(例如,在实例化中只需将LinkedList
replace为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的静态信息,因为你将依赖于提供的接口这种集合从其实现中抽象出来。