我正在编写一些接口,但我现在这样做的方式似乎打败了接口的目的。原因是我需要在使用接口之前先实例化实现的实例,如下所示:
Interface interfaceName = new InterfaceImplementation(someRequiredValueForConstructor);
这对我来说没有意义,因为我认为接口的意义在于用户不应该调用实现,但是必须按照我现在设置它的方式这样做。接口被声明为接口,实现被声明为实现接口的类。我应该如何设计我的接口,以便使用永远不必直接使用实现?
答案 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)
我认为你混合了两个概念,因此感到困惑。
我们只需要在使用者类中使用接口方法,这样就可以独立使用实现。
您可以将接口实现类的实例化部分外部化到公共位置,以使用法更清晰,例如:工厂模式。这是“Spring Dependency Injection”的核心。
请注意,接口只是表现得像标记,如果没有具体的实现,它们将无法工作。