![](/img/trans.png)
[英]Why I must use `@RequestParam` annotation on implementation class instead of interface class only?
[英]Why should I use an interface when there is only one implementation class?
我是編程新手,正在學習 Java。 我只是想知道為什么我應該在只有一個實現類的情況下使用接口?
這樣做是為了防止其他人訪問您的實現類型。 例如,您可以在庫中隱藏實現類型,提供類型包訪問,並將接口實例返回給庫的用戶:
// This is what the users of your library know about the class
// that does the work:
public interface SomeInterface {
void doSomethingUseful();
void doSomethingElse();
}
// This is the class itself, which is hidden from your clients
class MyImplementation implements SomeInterface {
private SomeDependency dependency = new SomeDependency();
public void doSomethingUseful() {
...
}
public void doSomethingElse() {
...
}
}
您的客戶獲得如下對象:
public class MyFactory {
static SomeInterface make() {
// MyFactory can see MyImplementation
return new MyImplementation();
}
}
當實現使用大量庫時,這個技巧變得有用。 您可以有效地將庫的接口與其實現分離,以便用戶不必了解庫內部的依賴項。
一個原因是保持開放/封閉原則,該原則指出您的代碼應該是可以擴展的,但是關閉以進行修改。 雖然你現在只有一個實現類,但是隨着時間的推移,你可能需要另一個不同的實現類。 如果事先將實現提取到接口中,則只需編寫另一個實現類即。 您無需修改完美的代碼,從而消除了引入錯誤的風險。
它可以讓您靈活地在將來添加更多實現,而無需更改引用該接口的客戶端代碼。
另一個有用的例子是在需要時在Java中模擬多重繼承。 例如,假設您有一個接口MyInterface
和一個實現:
public interface MyInterface {
void aMethod1();
void aMethod2();
}
class MyInterfaceImpl implements MyInterface {
public void aMethod1() {...}
public void aMethod2() {...}
}
您還有一個與其自己的層次結構無關的類:
public class SomeClass extends SomeOtherClass {
...
}
現在,您希望SomeClass
的類型為MyInterface
但您還希望繼承MyInterfaceImpl
已存在的所有代碼。 由於您無法擴展SomeOtherClass
和MyInterfaceImpl
,因此可以實現接口並使用委托:
public class SomeClass extends SomeOtherClass implements MyInterface {
private MyInterface myInterface = new MyInterfaceImpl();
public void aMethod1() {
myInterface.aMethod1();
}
public void aMethod2() {
myInterface.aMethod2();
}
...
}
尊重接口隔離原則。
創建接口的決定不應該基於實現類的數量,而應該基於使用對象的不同方式的數量。 使用對象的每種方式都由接口表示,接口由使用它的代碼定義。 假設您的對象需要存儲在內存中,保存在按順序保存對象的集合中。 同一個對象也需要存儲在一些持久存儲中。
假設您首先實現持久性。 存儲系統需要的是持久對象的唯一標識符。 使用方法getUniqueId創建一個接口,比如Storable。 然后,您實現存儲。
然后,您實現該集合。 您可以使用方法compareTo從接口中的存儲對象(如Comparable)定義集合所需的內容。 然后,您可以依賴Comparable實現集合。
您要定義的類將實現兩個接口。
如果要定義的類實現單個接口,則該接口必須表示集合和存儲系統的需要。 這會導致,例如:
集合的單元測試必須用實現可存儲的對象編寫,增加了復雜程度。
如果以后需要顯示對象,則必須將顯示代碼所需的方法添加到單個接口,並修改測試以進行收集和存儲,以實現顯示所需的方法。
我在這里討論對測試代碼的影響。 如果其他生產級別對象需要存儲而不顯示,則問題會更大。 項目越大,不遵守接口隔離原則所產生的問題就越大。
我看到這篇文章中提出了很多好的觀點。 也想把我的 2 美分加到這個知識集里。
接口 鼓勵在團隊環境中進行並行開發。 可以有 2 個類 A 和 B,其中 A 調用 B 的 API。 可以有 2 個開發人員同時在 A 和 B 上工作。當 B 還沒有准備好時,A 完全可以通過與 B 的接口集成來進行自己的實現。
接口是在不同代碼層之間建立 API 契約的良好基礎。
將關注點與接口處理隱式 API 文檔分開是很好的。 參考一個並確定客戶端可以調用哪些 API 非常容易。
最后,最好在項目中練習使用接口作為標准,而不是在個案基礎上使用它(您需要多個實現)。 這確保了項目的一致性。
對於 Java 代碼的藝術,接口使 thmem 更加漂亮:)
接口可以由多個類實現。 沒有規則只有一個類可以實現這些。 接口為java提供抽象。
http://www.tutorialspoint.com/java/java_interfaces.htm您可以從此鏈接獲取有關接口的更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.