2012-10-10 19 views
0

可能重复:
List versus ArrayList as reference type?泛型列表initilaization到ArrayList的

我在StackOverflow上读的地方,这样的:

List<String> foo = new ArrayList<String>(); 

是ArrayList的初始化时的最佳实践。并且这:

ArrayList<String> foo = new ArrayList<String>(); 

应该避免。它是否正确?如果是的话,有人可以解释为什么这样?

感谢, EG

+2

可能重复[List与ArrayList作为引用类型?](http://stackoverflow.com/questions/4062982/list-versus-arraylist-as-reference-type),[什么是列表与ArrayList ?](http://stackoverflow.com/questions/6867484),[Java List vs ArrayList](http://stackoverflow.com/questions/9309093),[List vs ArrayList](http://stackoverflow.com/问题/ 7726361)和[返回ArrayList或列表?](http://stackoverflow.com/questions/11683044) –

+1

如果你想用另一个列表替换ArrayList,你需要多少个地方来改变/检查它可以正常工作每个例子? –

回答

1

这是大多数开发人员如何使用ArrayList(包括我自己),并且是多态的一般原则。您应该使用类层次结构中的最高类/接口,但仍可以使用所有功能。

一般情况下,这使得代码更灵活,并且可以更容易地切换出来实现,因为你知道有List该节目的类型没有必然您使用只在ArrayList和不可用任何方法,比如说,一个LinkedList

例如,如果我这样做:

LinkedList<String> strings = new LinkedList<String>(); 
String s = strings.pop(); 

pop是独家LinkedList,所以我不能只是直接将其更改为一个ArrayList。我不得不也更改我的代码:

ArrayList<String> strings = new ArrayList<String>(); 
String s = strings.remove(strings.size() - 1); 

但如果我刚刚使用的接口,我从来没有在第一时间使用pop,所以我可能已经只是改变strings到任何实现我通缉。

编程API时,这一点尤为重要。如果你的方法是可公开访问的并且会被其他开发者使用,那么你需要确保你没有限制你的方法采用的是什么类型的列表,除非你有足够的理由这样做,特别是因为他们可能有的好理由不是想使用ArrayList

如果你除了迭代和增加/删除什么都不做,你甚至可以高达Collection。虽然这里你开始丢失上下文,因为List告诉你它可能包含重复项并且是手动排序的。但是,如果这不是特别重要,并且您可以使用Collection,则甚至可以用Set的实现替换列表。

+0

感谢您的详细回复。清除了我所有的疑惑。 – aa8y

0

是的,首先一个给人灵活改变实现稍后会与客户端最小的变化。

例如,您可以将ArrayList更改为LinkedList,但如果使用接口方法,客户端受到的影响最小。

List<String> tempList = new LinkedList<String>(); 
0

它被称为设计接口。 如果将List定义为参数,那么您的代码将会很灵活,ArrayList和LinkedList(或其他实现接口列表的实体)都可以用作基础实现。