[英]Confused about how to write interfaces in Java
我正在編寫一些接口,但是我現在做的方法似乎破壞了接口的目的。 原因是我需要先實例化實現的實例,然后才能使用該接口,如下所示:
Interface interfaceName = new InterfaceImplementation(someRequiredValueForConstructor);
這對我來說沒有意義,因為我認為界面的重點是用戶不必調用實現,但是有必要使用我現在設置它們的方式進行調用。 接口被聲明為接口,實現被聲明為實現該接口的類。 我應該如何設計接口,以使使用永遠不必直接使用實現?
接口的重點是指定所有實現都遵循的協定。 實例化時必須使用某種特定的實現,否則您會選擇哪種實現?
使用接口鍵入內容的好處是,您可以根據需要輕松地換出實現(例如,換成帶有LinkedList<T>
的ArrayList<T>
LinkedList<T>
;如果您使用List<T>
鍵入了變量,則此更改應該是無縫的)。 使用接口還可以減少代碼與特定實現的緊密耦合。
此外,當您使用諸如依賴注入或控件倒置之類的方法時,可以使用接口鍵入依賴關系。 如果您使用的是支持框架(例如Spring),那么它可能足夠聰明,可以為您找到實現。 您還可以告訴框架使用接口的特定實現。 但是關鍵是您的代碼不會期望任何特定的實現,這意味着您將來可以根據需要將它們切換出。
有些模式(例如Abstract Factory)和其他模式會在用戶不必擔心的地方傳遞實現的創建,但是接口的主要思想是不要讓“用戶從不調用實現”。 畢竟,您一直都在通過ArrayLists
使用List
接口。
interface
允許您開發類必須遵循的契約。 例如,如果您有Radio
類,則可以使用以下方法定義接口:
public void Send(String msg);
-通過RF傳輸字符串。
public String Listen();
-通過RF監聽字符串。
現在,當您實際創建特定類型的Radio
,必須實現上述方法:
public class MyRadio implements Radio
{
@Override
public void Send(String msg)
{
// Implementation specific details for MyRadio
}
@Override
public String Listen()
{
// Implementation specific details for MyRadio
}
}
然后,您可以執行以下操作:
Radio radio = new MyRadio();
我認為您混淆了兩個概念,因此感到困惑。
我們只需要在使用者類中使用接口方法,這使得用法實現獨立。
您可以將接口實現類的實例化部分外部化到常見位置,以使用法更加簡潔,例如工廠模式。 這是“ Spring依賴注入”的核心。
請注意,接口的行為就像標記,沒有具體的實現就無法工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.