2014-03-14 48 views
1

我已經令人驚訝地永遠無法理解這樣做的目的:接口編程的目的是什麼?

Map telephoneNumbers = new HashMap(); 
List<Object> list = new ArrayList<Object>(); 

,而不是這樣做:

HashMap telephoneNumbers = new HashMap(); 
ArrayList<Object> list = new ArrayList<Object>(); 

+0

問題的標題可能不是很好,請隨時編輯它,謝謝 –

回答

2

前兩句抽象了你的集合的實現。我的意思是,你知道你有一個地圖和一個列表,但你沒有被鏈接到一個特定的實現。

在另一方面,變量telephoneNumbers列表被迫使用的具體落實:一個哈希表和數組列表。 What does it mean to "program to an interface"?

2

當你這樣做:

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類型的接口是絕對有意義的。

+0

[示例](http://stackoverflow.com/a/22373138/1122039)接口的優點 - 它會如果JsonObjectBuilder是一個類,那就不那麼容易了。 – Cebence

1

原因之一 - 它可以更容易地更換實現。

假設您想使用TreeMap而不是HashMap,因此您可以按順序打印電話號碼。或者,您可能想要使用LinkedList而不是ArrayList,以便更快速地插入/刪除/排序。

如果使用接口版本(Map和List),那麼只需在構建數據結構的地方進行這些更改。