2012-01-17 47 views
2

大多數(彈簧和JPA)類都是用接口設計的。 除繼承任何技術原因是否存在?像dynaimc代理或AOP,我需要這個使用接口的原因有哪些(Java EE或Spring和JPA)

public interface UserDAO { 
    void delete(); 
    void update(); 
    void save(); 
    List<User> get(); 
} 

public class UserDAOImpl implements UserDAO { 
    public void delete(){} 
    public void update(){} 
    public void save(){} 
    public List<User> get(){} 
} 
+0

的[彈簧和接口(http://stackoverflow.com/questions/256255/spring-and-interfaces) – tolitius 2012-01-17 22:29:43

回答

20

主要有3個原因,IMO:

第一個原因:proxie秒。

如果你問Spring的UserDAO類型的bean,它實際上會返回一個代理封裝實際的UserDAOImpl實例。這使得它可以劃分事務,驗證安全授權,記錄訪問,計算統計數據等。可以在沒有接口的情況下完成,但是需要字節碼操作。

第二個原因:可測性。

在對使用UserDAO的業務服務進行單元測試時,通常需要注入一個模擬的UserDAO實現。再次,當UserDAO是一個接口時,這樣做更容易。這可能與一個具體的類,但它並不總是,並且它更容易與一個接口

第三個原因:解耦。

通過使用接口,您可以在其中爲客戶定義DAO的實際合同。當然,在具體實施中它需要一個setDataSource()方法,但客戶不關心這一點。他們所需要的只是DAO提供的一組數據訪問方法。通過分離接口和具體實現,可以確保客戶端不依賴DAO的實現細節。

+0

謝謝。第一個原因+1(可能沒有接口,但需要字節碼操作) – Arun 2012-01-17 13:28:19

+1

你是指所有三個權利+1?編碼到接口時,單元測試更容易。 – 2012-01-17 13:40:36

+0

當然是全部 – Arun 2012-01-17 13:48:40

6
  1. 接口,一個是合同,因爲我看到他們更多的技術細節。例如,一組軟件工程師(Implementation classes)可能與公司(Interface)有特定的合同。根據項目需要,公司可能會不定期地在工程師之間進行切換。由於他們屬於同一合同並遵循相同的規則,因此每次項目需要變更時,切換都比從外部引入資源(編寫新課程)更容易。你只需要改變配置來切換實現類。

  2. 接口是乾淨的,並且是對類實現的規則的單點訪問。

鏈接

  1. spring and interfaces
  2. What does it mean to "program to an interface"?
  3. http://www.artima.com/lejava/articles/designprinciples.html
+1

引用現有問題瓦特可能重複/ o進一步的討論應該幾乎總是要麼是密切/重複的投票,要麼是IMO的評論。 – 2012-01-17 13:01:43

+0

@Dave牛頓 - 讓人們指向正確的方向有時候會消耗一些時間,我覺得應該是「獲獎」。 upvote說'這個答案很有用',並被那些認爲有用的國際海事組織選擇是可以接受的。 – 2012-01-17 13:42:26

+0

我很好,你相信任何你想要的;我們不建議按照[這裏](http://meta.stackexchange.com/questions/118582/what-is-an-acceptable-answer)和[here](http:// meta。 stackexchange.com/questions/118926/right-way-to-answer-a-question-with-just-a-link)。 – 2012-01-17 14:05:01