2014-01-13 45 views
4

爲什麼在實際實現中必須重新輸入每個方法時,Java中使用的接口?什麼是寫出界面使事情變得更簡單的情況的例子?爲什麼在實際實現中必須重新輸入每個方法的Java中使用的接口?

+1

閱讀關於[interfaces](http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html)以及它們爲什麼用作合同並幫助您的代碼更加靈活 – gtgaxiola

+0

根據C++的一種替代方案是允許多繼承,這將允許您繼承兩個抽象類,但其他問題是Java設計者決定不這樣做的原因之一 – Mark

回答

9

接口定義了一個契約,而不是一個實現。這可以讓你脫離接口的實際實現 - 只要實現滿足合同,你就很高興。

說你調用返回一個List(這是一個接口)的方法。您可以使用該列表,因爲您知道它具有列表功能,如get()和add()。你不必擔心列表是什麼種類。如果List碰巧是一個ArrayList,然後該方法改爲返回一個LinkedList,您根本不必更改代碼,因爲兩者都保證具有List函數。

+0

換句話說,當代碼需要多個實現類似的藍圖,並有這樣的藍圖/合同,確保每個單獨的實施具有所有必要的方法,同時允許實例細節的情況下逐案變化? – mango

+0

當然,這是一種方法。 –

+0

哦,等一下。我現在看到你正在更多地沿着定義接口的方式來使用數據類型! (http://docs.oracle.com/javase/tutorial/java/IandI/interfaceAsType.html)我只是想到一個類何時實現一個接口。 – mango

0

接口最大的好處之一是你可以在方法參數和返回類型中使用接口。例如,您可以編寫:

public List join (List list1, List list2) 
{ 
    // some complicated stuff using list1.size() and list2.get() etc 
} 
+0

更好的是,使用Collection的更通用。 – SergeyB

0

接口有許多優點。

假設下面的代碼:

public class MyClass { 
    public List<String> getNames() { 
     List<String> names = new ArrayList<String>(); 

     // Populate list of names 

     return names; 
    } 
} 

正如凱文工人在他出色的答覆中提到,一個接口用於定義implenting類必須履行合同。在上述情況下,getNames方法指出它將返回接口List的一個實例。但是,合同並不強制您使用特定的List實施;可以使用任何實現List的具體類。在這種情況下,選擇了ArrayList

後來在你的項目,如果你最終認識到一個LinkedList將是您的應用程序更好地執行,您可以輕鬆地改變List<String> names = new ArrayList<String>();List<String> names = new LinkedList<String>();,而無需更改方法簽名,或對現有代碼的其餘部分在方法裏面。這是一個很好的做法,它可以防止項目中的許多問題和/或時間浪費。

此外,使用接口允許您(或您的代碼的客戶端)定義最適合其需求的具體實現。在Map實現的情況下,有些更快,有些則更節省空間。

構建單元測試集時,可以理解接口的另一個優點。大多數模擬框架(如果不是全部的話)都可以使用接口。它使您可以構建不需要每個具體測試實現手動編碼的測試,並且可以使測試代碼庫變得更小/更簡單。

當構建一個將被其他開發人員使用的API時,接口的使用可以使您的API更簡單,並且方便您的客戶使用API​​。一個例子是Java提供的DOM XML implementation。如果你看看API,幾乎只有接口,沒有具體的類被暴露。在維護這個API期間,開發人員可以添加/更改/刪除任何具體的實現,而不用擔心會破壞與現有客戶端代碼的向後兼容性。

如果他們已經公開具體實現,他們會在API的整個生命週期中把他們的手綁在一起。例如,假設他們提供了一個名爲BuggedElement的公共實現錯誤Element,客戶端直接在其代碼中使用它。從這一點開始,他們將被迫維持這個實現,而不是僅僅刪除它並編寫一個新的實現,否則使用這個具體實現的現有項目將被迫重新編寫參考BuggedElement的代碼段。但是,由於他們選擇僅在其公共API中提供接口,因此他們可以修改現有的實現,或者擺脫它們並編寫新的實現,而且它們永遠不會破壞客戶端的代碼。

相關問題