好,所以我知道Set
,List
和Map
是接口,但是什麼使得第一行代碼比第二行更好?列表與ArrayList作爲引用類型?
List myArr = new ArrayList();
ArrayList myArr = new ArrayList();
好,所以我知道Set
,List
和Map
是接口,但是什麼使得第一行代碼比第二行更好?列表與ArrayList作爲引用類型?
List myArr = new ArrayList();
ArrayList myArr = new ArrayList();
如果使用第一種形式,你說你曾經打算使用所有在List
界面的功能 - 不出意外,尤其是沒有額外的由它執行任何添加。這意味着您可以輕鬆更改所使用的實現(例如,只需在實例化中將LinkedList
替換爲ArrayList
),而不用擔心會破壞代碼的其餘部分,因爲您可能使用了特定於ArrayList
的某些內容。
我認爲當你提到在一個Collections.checkedList()中包裝你的ArrayList以進行調試時,情況會更加引人注目。當你提到LinkedList時,人們會說「爲什麼我會使用LinkedList?」。 – ILMTitan 2010-11-01 15:50:43
@ILMTitan:同意。這是比不必切換到「LinkedList」更常見的情況。但'LinkedList'也很有用,當我需要在開始時進行大量的添加/刪除操作時,我不得不切換到使用它們。這裏的要點是將實現和接口分開,以便可以更改實現,而不必對其餘代碼進行大量更改。 – MAK 2010-11-01 16:33:03
正如你可以從ArrayList
here來源看,大部分的實施註釋爲@override
的方法,因爲所有的人都認爲通過List
接口定義,因此,如果你要使用只是基本功能(也就是你是什麼會在大部分時間裏完成),這種差異不會有實際意義。
如果有一天您會認爲ArrayList
的功能不再適合您的問題,並且您需要不同的東西(例如LinkedList
),那麼就會出現差異。如果您聲明所有內容爲List
,但實例化爲ArrayList
,則可以通過將實例更改爲new ArrayList()
來輕鬆切換到新實現,而在其他情況下,您將不得不更改所有變量聲明。
使用List list = new ArrayList()
是更多的OOP風格,因爲您聲明您不關心列表的具體實現,並且您想放棄有關該類型的靜態信息,因爲您將依賴此類提供的接口集合從其實現中抽象出來。
關於編程類型(有時簡稱爲robustness principle)一個有用的一般原則如下:
列表比ArrayList更自由,因爲List可以是任何種類的List實現,例如ArrayList,LinkedList或FrancosSpecialList。因此,自由派和接受任何類型的名單是一個好主意,因爲您可能想稍後改變實施。
將ArrayList明確用作類型(您的第二種情況)的主要原因是您需要使用通過List接口不可用的ArrayList特有的方法。在這種情況下,通用列表將不起作用(除非你想做大量醜陋和令人困惑的投射),所以你可以直接使用ArrayList。這爲讀者提供了需要ArrayList的特定功能的額外好處。
第二行比較好,因爲ArrayList類型除了List之外還提供了更多的功能。但是,當您執行不依賴於List實現的代碼時,List類型會更好。請覆蓋我的[ArrayList的內部生活](http://volodial.blogspot.com/2013/07/internal-life-of-arraylist-in-java.html)以深入瞭解它。 – 2013-08-05 14:13:46