2012-09-21 91 views
2

我們對集合使用接口引用。僅僅是爲了良好的編碼習慣還是有一些邏輯背後的邏輯?誰能解釋一下?使用對集合的接口引用

例如:

我們使用

Map<String, Integer> map = new HashMap<String,Integer>(); 

而不是

HashMap<String, Integer> map = new HashMap<String,Integer>(); 
+1

相關 - http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface – Premraj

回答

3

interface將允許你改變在未來實現透明(沒有在客戶端上的許多變化)。

例如:

Map<String, Integer> map = new LinkedHashMap<String,Integer>(); 

即使你改變實施的LinkedHashMap,客戶並不需要把他們的最終的任何變化。

如果使用

HashMap<String, Integer> map = new HashMap<String,Integer>(); 

客戶端緊密結合實現。如果你改變實現,那麼你也需要改變客戶端。

一個缺點是,如果你想使用任何實現特定的方法,你需要轉換爲相應的類型並使用它。

3

如果您使用HashMap您的實施將變爲特定於HashMap但如果您使用Map您可以將其更改爲任何Map Implementation

您可以閱讀項目52:通過其接口引用對象來自Effective Java。

2

這個想法是,你代碼到組件的合同,而不是執行。 java.util.Map有許多實現,如果需要,可以無縫交換,只要你的代碼完全依賴於接口。

鬆散耦合通常是很好的做法。

1

代碼維護是一個優點,如果有人想要使用其他具體的Map,則只需要更改一行而不是幾十個。在你的代碼片段的例子中看起來可能不是這樣,只有當對象引用的使用在參數和返回類型中普遍存在時纔會出現問題。我認爲從一開始就開始「思考接口」而不是從對象開始,以避免編寫帶來這些問題的代碼的傾向。 報價Allen Hollub這裏

如果你寫你的客戶端代碼,使得它僅涉及通過一個接口,而不是由某一類實際執行保障能力,你將有更多的自由來改變實現的未來。

1

的東西如下 -

class MapTest { 
    Map<String, Integer> map; 

    public MapTest(Map<String, Integer> map) { 
     this.map = map; 
    } 

    public void setMap(Map<String, Integer> map) { 
     this.map = map; 
    } 

    //do stuffs with map 
} 

,你可以在不同的Map實現通過。但是,如果map的類型爲HashMap那麼它將不得不是HashMap(或者如果您繼承它的子類,則它是HashMap)。

0

第一種方法是更加靈活然後第二:

Map<String, Integer> map = new HashMap<String,Integer>(); 

這樣一來,你有,如果你決定使用TreeMap而不是改變只有一條線。

同樣,上套操作的方法應指定Map類型的參數:

public static void print(Map<String, Integer> s) 

然後可以被用於所有的映射實現的方法。

理論上,我們應該對鏈表進行相同的推薦,即將LinkedList引用保存在List類型的變量中。