2012-10-10 21 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(或其他實現接口列表的實體)都可以用作基礎實現。