我有一個接口,只有一個實現。以下對代表一個簡單的java對象。我想刪除該接口並直接使用對象。但是我想知道什麼時候需要它,以及爲什麼它是以這種方式設計的。這絕對不是爲了減輕單元測試的覆蓋。那麼,爲什麼我的項目中只有一個實現的接口呢? 謝謝。我需要一個只有一個實現的接口嗎?
回答
當您可能擴展/更改項目時,該接口非常有用。例如,如果您通過將數據存儲在文本文件中來啓動項目,然後決定從數據庫更改爲這樣做。如果這兩者都是相同接口的實現,那麼將第一個交換爲第二個非常簡單。只是在使用它的類中交換具體實現的一個例子。例如,簡單地改變
IStorage storage = new FileStorage();
到
IStorage storage = new DBStorage();
雖然它可能看起來毫無意義的有一個實施的接口,它可以在以後爲您節省大量重構工作。
我只把最後一行作爲答案。 – 2013-04-25 15:35:54
如果你有一個IDE來做這個重構,你可以稍後改變它(假設你可以訪問所有使用它的源代碼) – 2013-04-25 15:59:52
@PeterLawrey你建議用IDE中的一個特性替換好的編碼實踐嗎?這聽起來像個壞主意。如果您想切換回FileStorage或添加第三種存儲類型,該怎麼辦?或者,也許用戶可以選擇存儲類型。提取細節和實現,以便核心代碼庫不必更改將是IMO更好的方法。 – Despertar 2013-04-26 07:50:14
如果您爲實現定義接口並在程序中使用該接口,則可隨時編寫新實現並將其替換爲舊實現,而不更改使用它的類的代碼。
這是一種使用界面而不是實現的最佳實踐,這種方式改變需求的危害較小。
如果你正在爲你的代碼做單元測試(我希望你這樣做),你很有可能需要用一些存根實現來嘲笑你的類的使用。 所以你至少需要接口來進行單元測試。
P.S.我知道,像Mockito這樣的現代嘲笑框架可以基於類來做嘲笑,所以從技術上講,你可以在沒有接口的情況下實現這一點。但(對我來說)感覺像是黑客,因爲這正是應該使用界面的地方。
這取決於。但這並不是一個壞主意。
在C語言和許多Pascal版本中,將接口與實現分離是熟悉的操作。它有助於編譯器避免在模塊所依賴的更改實現時不必要地重新編譯模塊。
在Java中,編譯器通常不是問題。 Java提供了公共,受保護,私有和包私有(隱式)訪問類,這些類限制了其他類可以依賴於特定類的詳細信息。 Javadoc提供(默認情況下)文檔,省略不需要的和不需要的細節。我們也有YAGNI的廣泛宣傳原則:如果「你不需要它」,不要設計它。儘管如此,在Java中使用顯式接口而不是直接使用實現提供了一個額外的機會,可以非常清楚特定類的用戶應該依賴的結構和行爲。實現多個接口的能力意味着特定類的用戶甚至可以指定對實現的一個或多個特定方面的依賴性,例如其Serializable特性。
- 1. 必須實現接口A或接口B(只有一個)
- 2. 做一個工廠只是返回一個接口的實現?
- 3. 什麼是一個不需要實現的接口?
- 4. 我只需要一個WSDL,我也需要一個XSD?
- 5. AS3:我如何需要一個方法參數來實現多個接口?
- 6. 實現一個java接口
- 7. 實現一個接口
- 8. 我可以在實例化一個匿名類時實現一個接口嗎?
- 9. Java爲什麼需要實現一個接口?
- 10. 我需要一個UINavigationController嗎?
- 11. 爲什麼我需要實現一個更一般的接口,如果我已經實現了一個專門的接口?
- 12. 實現只有一個類或更多類的接口
- 13. 有條件地實現一個接口
- 14. 自動實現一個接口來封裝現有的實現
- 15. 你會爲2個類實現一個類或2個接口的接口嗎
- 16. 我們可以在jsp中實現一個接口嗎?
- 17. 我可以用PHPUnit模擬一個接口實現嗎?
- 18. 如何在另一個接口中實現一個接口
- 19. 如果我有一個圖標,我需要鏈接到它嗎?
- 20. 需要一個OOP Cobol的實例嗎?
- 21. 需要一個接口的c#方法?
- 22. 哪個接口一個類實現?
- 23. 擴展一個類(實現接口)並實現相同的接口不需要類中的方法定義?
- 24. 我有一個MapsActivity,我需要將它鏈接到一個ActivityBarFragment
- 25. 多個接口 - 只需要1的ID
- 26. 我怎樣才能使一個接口實現另一個接口
- 27. 套接字連接只需要一個線程嗎?
- 28. 類設計:類實現接口實現另一個接口
- 29. 一個實現一個界面,需要一個枚舉
- 30. 在Java中,如果一個類實現了一個接口,是否需要編譯該接口?
你想告訴我們代碼或簡化版本的代碼? – 2013-04-25 15:32:55
爲什麼某件事是你代碼中的一種特定方式,只有一個人可能會告訴你......這就是你的代碼的程序員。爲什麼不問那個人,爲什麼他們做了他們做的? – 2013-04-25 15:34:36
因爲這個人對於Java來說不是太好就是太可怕了。 (需要更多代碼) – Zyerah 2013-04-25 15:34:54