簡體   English   中英

對如何用Java編寫接口感到困惑

[英]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();

我認為您混淆了兩個概念,因此感到困惑。

  1. 我們只需要在使用者類中使用接口方法,這使得用法實現獨立。

  2. 您可以將接口實現類的實例化部分外部化到常見位置,以使用法更加簡潔,例如工廠模式。 這是“ Spring依賴注入”的核心。

請注意,接口的行為就像標記,沒有具體的實現就無法工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM