2010-10-31 61 views
20

好,所以我知道Set,ListMap是接口,但是什麼使得第一行代碼比第二行更好?列表與ArrayList作爲引用類型?

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

第二行比較好,因爲ArrayList類型除了List之外還提供了更多的功能。但是,當您執行不依賴於List實現的代碼時,List類型會更好。請覆蓋我的[ArrayList的內部生活](http://volodial.blogspot.com/2013/07/internal-life-of-arraylist-in-java.html)以深入瞭解它。 – 2013-08-05 14:13:46

回答

32

如果使用第一種形式,你說你曾經打算使用所有在List界面的功能 - 不出意外,尤其是沒有額外的由它執行任何添加。這意味着您可以輕鬆更改所使用的實現(例如,只需在實例化中將LinkedList替換爲ArrayList),而不用擔心會破壞代碼的其餘部分,因爲您可能使用了特定於ArrayList的某些內容。

+2

我認爲當你提到在一個Collections.checkedList()中包裝你的ArrayList以進行調試時,情況會更加引人注目。當你提到LinkedList時,人們會說「爲什麼我會使用LinkedList?」。 – ILMTitan 2010-11-01 15:50:43

+1

@ILMTitan:同意。這是比不必切換到「LinkedList」更常見的情況。但'LinkedList'也很有用,當我需要在開始時進行大量的添加/刪除操作時,我不得不切換到使用它們。這裏的要點是將實現和接口分開,以便可以更改實現,而不必對其餘代碼進行大量更改。 – MAK 2010-11-01 16:33:03

6

正如你可以從ArrayListhere來源看,大部分的實施註釋爲@override的方法,因爲所有的人都認爲通過List接口定義,因此,如果你要使用只是基本功能(也就是你是什麼會在大部分時間裏完成),這種差異不會有實際意義。

如果有一天您會認爲ArrayList的功能不再適合您的問題,並且您需要不同的東西(例如LinkedList),那麼就會出現差異。如果您聲明所有內容爲List,但實例化爲ArrayList,則可以通過將實例更改爲new ArrayList()來輕鬆切換到新實現,而在其他情況下,您將不得不更改所有變量聲明。

使用List list = new ArrayList()是更多的OOP風格,因爲您聲明您不關心列表的具體實現,並且您想放棄有關該類型的靜態信息,因爲您將依賴此類提供的接口集合從其實現中抽象出來。

10

關於編程類型(有時簡稱爲robustness principle)一個有用的一般原則如下:

  • 起人來你接受
  • 要保守你發出什麼
什麼

列表比ArrayList更自由,因爲List可以是任何種類的List實現,例如ArrayList,LinkedList或FrancosSpecialList。因此,自由派和接受任何類型的名單是一個好主意,因爲您可能想稍後改變實施。

將ArrayList明確用作類型(您的第二種情況)的主要原因是您需要使用通過List接口不可用的ArrayList特有的方法。在這種情況下,通用列表將不起作用(除非你想做大量醜陋和令人困惑的投射),所以你可以直接使用ArrayList。這爲讀者提供了需要ArrayList的特定功能的額外好處。

相關問題