我已經令人驚訝地永遠無法理解這樣做的目的:接口編程的目的是什麼?
Map telephoneNumbers = new HashMap();
List<Object> list = new ArrayList<Object>();
,而不是這樣做:
HashMap telephoneNumbers = new HashMap();
ArrayList<Object> list = new ArrayList<Object>();
?
我已經令人驚訝地永遠無法理解這樣做的目的:接口編程的目的是什麼?
Map telephoneNumbers = new HashMap();
List<Object> list = new ArrayList<Object>();
,而不是這樣做:
HashMap telephoneNumbers = new HashMap();
ArrayList<Object> list = new ArrayList<Object>();
?
前兩句抽象了你的集合的實現。我的意思是,你知道你有一個地圖和一個列表,但你沒有被鏈接到一個特定的實現。
在另一方面,變量telephoneNumbers和列表被迫使用的具體落實:一個哈希表和數組列表。 What does it mean to "program to an interface"?
當你這樣做:
HashMap telephoneNumbers = new HashMap();
ArrayList<Object> list = new ArrayList<Object>();
你綁到,如果你使用你的第一個變量設置你面向接口編程,而不是執行這是一個基本的OOP原理
所以具體實施,即ArrayList
。如果您要將list
對象進一步傳遞給其他方法,那麼您並不太靈活。如果您編程接口,請改爲Collection
(其擴展List
),您可以稍後更改實施。例如,如果在列表中的對象應該是唯一的,那麼你可以很容易地改變這是一個Set
,而不是(因爲臺只包含獨特的對象):
HashMap telephoneNumbers = new HashMap();
Collection<Object> list = new HashSet<Object>();
編程到接口的原理實際上是關於依賴關係。這是密切相關的OO concept of Encapsulation概念:
- 語言機制,限制對某些對象的組件的訪問。
- 一種語言結構,便於將數據與在數據上運行的方法(或其他函數)捆綁在一起。
最重要的方面是,通過以下編程到的接口範式,我們都在問我們自己「什麼」之類的可以做,但不是「如何」,它會做到這一點,它關注的是實際執行。
使用ArrayList
您將代碼緊密耦合到ArrayList
類。如果您只使用Collection
接口(add()
,remove()
等)中的通用方法,那麼將list
聲明爲Collection
類型的接口是絕對有意義的。
[示例](http://stackoverflow.com/a/22373138/1122039)接口的優點 - 它會如果JsonObjectBuilder是一個類,那就不那麼容易了。 – Cebence
原因之一 - 它可以更容易地更換實現。
假設您想使用TreeMap而不是HashMap,因此您可以按順序打印電話號碼。或者,您可能想要使用LinkedList而不是ArrayList,以便更快速地插入/刪除/排序。
如果使用接口版本(Map和List),那麼只需在構建數據結構的地方進行這些更改。
問題的標題可能不是很好,請隨時編輯它,謝謝 –