传递对象的List或ArrayList

时间:2013-05-03 19:37:27

标签: java

List<Kevin> kevin = new ArrayList<Kevin>();

我有一个Kevin类型的对象列表,现在它对我传递给我的方法有什么不同吗?

void method1(List<Kevin>)

void method2(ArrayList<Kevin>)

似乎两者都有效,除了我可以访问method1和List interface related methods上的array list related methods on method2.之外,还有差异我只是不确定是否需要发送ListArrayList个对象。

4 个答案:

答案 0 :(得分:3)

他们的行为都是一样的。通常最好在可能的情况下对接口进行编码,因此更喜欢 List<Kevin>(如果只是需要遍历集合,则甚至是Iterable<Kevin>)。如果你的方法只有ArrayList<Kevin>才能正常运作,那就足够了......但除此之外,最好不要限制调用者强制他们传入ArrayList

答案 1 :(得分:2)

method1也适用于List的其他实现(例如LinkedList),而method2更严格,只接受一个实现。通常,出于可重用性原因,尽量使方法参数尽可能通用。

答案 2 :(得分:2)

在大多数情况下,它实际上并不重要。 ArrayListList,因此您从List获得的任何功能都来自ArrayList。我应该注意到,在同一个主体中,你可能实际上并没有得到ArrayList而是从ArrayList继承的某个子类(就像你说List一样)。

也就是说,通常认为最佳做法是要求您需要的通用类型。因此,如果您只需要List提供的方法,则传递List对象,但是,如果您需要ArrayList特定的内容,则传递该对象。

答案 3 :(得分:1)

传递一个ArrayList会阻止你(或至少使其变得更加困难)改变主意并在以后使用另一种List,因为method2()依赖于列表类型ArrayList,而不仅仅是List

您可能希望传递的其他List实现包括LinkedListCopyOnWriteArrayListArrays.asList()Collections.synchronizedList(),或者Collections.unmodifiableList()。< / p>

因此,最佳做法是在接口上进行编程,如果调用方法甚至不应假设它是List,则传递List(甚至是CollectionIterable

对于同一个类中的私有方法,它并不重要。但是如果该方法是公共API的一部分,那么传递一个ArrayList可能会在某个时候伤害到你。