2010-07-13 54 views
11

可能重複:
How are Java interfaces actually used?Java接口有沒有真正的意義?

我不是從一個角度accademic流行語點但是從一個開發者之實踐點說話。

因此,採取的例子: -

Class1 implements Interface 
public String methodOne() { 
    return "This is Class1.methodOne()"; 
} 

public String methodTwo() { 
    return "This is Class1.methodTwo()"; 
} 
    } 
Class2: 

    Class2 implements Interface 
public String methodOne() { 
    return "This is Class2.methodOne()"; 
} 

public String methodTwo() { 
    return "This is Class2.methodTwo()"; 
} 
    } 

界面的使用: -

Client { 
    Interface intface = new Class1(); 

    intface.methodOne(); 
    intface.methodTwo(); 

    Interface intface = new Class2(); 
    intface.methodOne(); 
    intface.methodTwo(); 
} 

但什麼是經過短短書面方式帶來的好處: -

Client { 
Class1 clas1 = new Class1(); 

clas1.methodOne(); 
clas1.methodTwo(); 

Class2 clas2 = new Class2(); 
clas2.methodOne(); 
clas2.methodTwo(); 
} 

並繞過接口共。

爲了增加一層代碼,接口似乎只是附加的代碼層,或者對他們來說更多的不僅僅是「這裏是您正在訪問的類的方法」?

+2

http://stackoverflow.com/questions/504904/how-are-java-interfaces-actually-used – skaffman 2010-07-13 08:35:29

回答

17

使用獨立類時,不需要接口。但是,如果您有類型層次結構,則接口確實是不可或缺的。

您的簡單示例並不真正公平,但我們將您的界面重新命名爲更有用且具體的內容,例如一個Sorter算法,它可以獲取項目列表並對其進行排序。您可以實現幾種不同的排序算法,並且您可能想要根據上下文更改所使用的算法(即QuickSort對於大型數據集更快,但BubbleSort對於小型數據集等效果更好)。因此,您不需要想要將客戶端代碼綁定到一個特定的算法。通過使用多態Sorter類型(作爲接口實現),您可以將不同的具體分類器對象傳遞給客戶端,而不必知道(並關心)它實際使用的算法。你可以隨時引入一個更好的排序算法,或者刪除一個效率低下的算法,而無需客戶注意任何事情。

沒有接口,這樣的壯舉是不可能的。另一種方法是直接從(可能重複的)if-else或switch塊中調用選擇的排序方法,當添加/刪除排序算法時忘記正確更新所有位置時不可避免地引入錯誤。 ..更不用說,在每次這樣的更改之後,您需要重新編譯所有客戶端代碼:-(

+0

一個快速的例子將是非常有用的!很好的答案! – jacoballenwood 2018-01-26 22:08:08

6

假設您想要使用「Method1」和「Method2」兩種方法的對象集合 而且您不想以編程方式檢查集合中的每個實例的類型
一個對象集合這個接口使您無法做到這一點的工具
它稱爲多態,它是非常有用 usef UL認證。

-1

考慮下面的方法,它接收'intfaces'列表,你不必知道你是否處理clas1或clas2,你只是想處理'是'intface。您可以稍後添加clas3實現intface,它將繼續工作...如果有,你需要一個以上的執行,也許對其他技術(不同的數據庫),或用於測試的機會

public void callMethods(List<intface> intfaces){ 
    for(Interface intface : intfaces) { 
     intface.methodOne(); 
     intface.methodTwo(); 
    } 
    } 
0

接口定義類型的契約,沒有anu實現細節。這使您可以在不知道實際實現類的情況下對接口進行編程。

的使用你的代碼的接口優勢的例子是:

public void useInterface(Interface obj) { 
    obj.methodOne(); 
    obj.methodTwo(); 
} 

,把它作爲:

useInterface(new Class1()); 
    useInterface(new Class2()); 

在Java集合類大量使用的接口,它可以讓你稍後切換列表和地圖的實現,而無需使用這些實例更改代碼。

1

其他人幾乎涵蓋了你的問題,但總而言之:是的!

Java語言實際上被認爲是一種相當小的面向對象的語言,並且從一開始就有接口。有一些概念描述了類之間的關係,如果沒有接口或者一些性能價格昂貴的運行時類型標識,這些概念很難或不可能完成。在着名的Design Patterns書(這裏是book itself)中引用的所有或幾乎所有模式都依賴於接口。

+0

GoF本書不依賴像Java接口這樣的顯式接口,而是依賴繼承和抽象類。 – deamon 2010-07-13 08:55:21

+0

在Java中實現模式時,除了使用接口而不使用抽象類外,沒有其他選擇,因爲無法從多個類繼承。 – 2010-07-13 09:02:53

1

(不知道我怎麼沒有它被視爲一個答案迴應,但...)

哇,這麼多的答案這麼快,相當令人印象深刻論壇 - 乾杯! :-D

因此,說一個接口本質上是設定具體類必須符合的「規則」是合理的嗎?

例如,如果我有類Class1 & Class2,它們都具有方法'getList()'。 沒有實現一個接口Class1.getList()可以返回說一個字符串列表和Class2.getList()可以返回整數。基本上,接口設置我的類必須具有getList()方法的規則,並且該方法必須返回List, ,因此如果兩者都使用方法'public String getList();'實現接口列表器我知道Class1 & Class2 getList()返回一個 String類型的列表。

但具體的Class1可能會返回部門列表,而Class2是員工列表,但我知道他們都返回一個字符串列表。

這可能會變得更有用,如果我有可能是半打左右的類每個都有六種方法,我想要 確保符合.getList返回一個類型的字符串'規則'的列表。

+1

迴應沒有被回答,你可以寫評論;) 「實現到接口而不是實現。」這使您可以更改實現,同時確保您的應用或其他應用(取決於您的應用)不會中斷。由於您的實施必須遵守界面的合同。 – Redlab 2010-07-13 09:08:59

+0

您可以編輯您的原始問題以添加您的回覆或澄清事情。 – rsp 2010-07-13 09:20:15

1

我使用的接口,主要用於

  • 模擬多重繼承
  • 定義服務合同,服務實現
  • 單一的方法回調契約

因爲

  • 小號青梅依賴注入框架要求的接口工作比嘲諷類
  • 許多AOP框架比類

接口更好地工作更容易

  • 嘲諷接口,它是不是真的一個代碼服務和客戶端之間的層,但更多的是一份正式合同。