对如何用Java编写接口感到困惑

时间:2013-11-12 16:52:05

标签: java interface

我正在编写一些接口,但我现在这样做的方式似乎打败了接口的目的。原因是我需要在使用接口之前先实例化实现的实例,如下所示:

Interface interfaceName = new InterfaceImplementation(someRequiredValueForConstructor);

这对我来说没有意义,因为我认为接口的意义在于用户不应该调用实现,但是必须按照我现在设置它的方式这样做。接口被声明为接口,实现被声明为实现接口的类。我应该如何设计我的接口,以便使用永远不必直接使用实现?

4 个答案:

答案 0 :(得分:3)

接口的目的是指定所有实现后面的合同。在实例化时,你使用某种特定的实现,否则你会选择哪种实现?

使用界面输入内容的优势在于,如果需要,您可以轻松交换实现(例如,使用ArrayList<T>替换LinkedList<T>;如果您使用{{{}输入了变量1}},这种变化应该是无缝的)。使用接口还可以使您的代码与特定实现紧密耦合。

此外,当您使用依赖注入或控制反转之类的东西时,您可以使用界面键入依赖项。如果您正在使用支持的框架(如Spring),那么为您找到实现可能足够聪明。您还可以告诉框架使用接口的特定实现。但重点是您的代码不期望任何特定实现,这意味着如果需要,您可以在将来切换它们。

答案 1 :(得分:1)

有一些模式,例如抽象工厂和其他模式,可以在用户不必担心它的地方通过创建实现,但接口的主要思想是没有&#34;用户永远不会调用实现&#34;。毕竟,您始终通过List使用ArrayLists界面。

答案 2 :(得分:1)

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();

答案 3 :(得分:0)

我认为你混合了两个概念,因此感到困惑。

  1. 我们只需要在使用者类中使用接口方法,这样就可以独立使用实现。

  2. 您可以将接口实现类的实例化部分外部化到公共位置,以使用法更清晰,例如:工厂模式。这是“Spring Dependency Injection”的核心

  3. 请注意,接口只是表现得像标记,如果没有具体的实现,它们将无法工作。