Java中的接口优势

Java中的接口优势,java,interface,Java,Interface,我的问题很简单:如果接口由单个类实现,那么使用接口有什么好处吗? 我一直认为只有当接口有多个实现时,接口才是好的 谢谢。接口是分离软件组件的一种方法。当然,您现在可以使用Oracle数据库来存储所有数据,那么为什么不放弃所有DAO接口呢 答案是,与任何事物的强烈耦合可能会在将来回来咬你。如果明年你想使用云服务来存储数据呢?如果您编码到DAO接口,您只需引入一个新的云实现并直接插入即可。您的应用程序是松散耦合的,因此不需要更改。考虑到现在可能只有一个实现,但将来可能会有更多的实现。此外,通过使用接

我的问题很简单:如果接口由单个类实现,那么使用接口有什么好处吗?
我一直认为只有当接口有多个实现时,接口才是好的


谢谢。

接口是分离软件组件的一种方法。当然,您现在可以使用Oracle数据库来存储所有数据,那么为什么不放弃所有DAO接口呢


答案是,与任何事物的强烈耦合可能会在将来回来咬你。如果明年你想使用云服务来存储数据呢?如果您编码到DAO接口,您只需引入一个新的云实现并直接插入即可。您的应用程序是松散耦合的,因此不需要更改。

考虑到现在可能只有一个实现,但将来可能会有更多的实现。此外,通过使用接口,您可以避免仅通过使用接口创建对具体类的依赖。然后,稍后,如果您决定更改实现,您可以创建一个新的实现接口,而不会对仅依赖于您的接口的其他代码产生不利影响

考虑:

public interface SomeInterface {...}

public class AConsumerOfSomeInterface {
    private SomeInterface service;

    public AConsumerOfSomeInterface(SomeInterface theImplementation) {
        service = theImplementation;
    }
    //some code which uses the service
}

现在,您可以在将来交换实现,而无需更改此类。因为这很容易做到,所以即使您认为不需要接口,使用接口也是有意义的。

问问自己,在不久的将来是否真的有可能有不止一种实现

您可以在需要时轻松添加接口,有时需要几个接口


即使为单个类创建接口时,唯一的情况是区分常用API和专用API(例如测试、监视)。

一句话:不。接口所指的契约可以直接在您的唯一类中指定

如果您清楚将来不需要相同方法的另一个实现,那么可以避免定义接口

当然,这里的问题是“未来”条款。如果项目很小,没有很长的开发/升级周期,并且定义良好,那么您几乎可以确定将来需要什么

如果项目很长,可能会发生变化,那么您必须考虑:

  • 您最终需要一个接口的可能性
  • 您现在知道接口将来需要什么方法的可能性
  • 现在做接口的成本与将来重构的成本
使用有什么好处吗 接口,如果它们是由 一节课

如果您的接口仅由一个类实现,并且您100%确信您永远不会感觉到需要添加另一个实现,那么没有任何优势

无论如何,我认为还有另一种情况需要记住。假设您有一个类,它做的事情比您想向另一个客户机类公开的要多。接口可用于限制客户端可以调用的类的方法:

public interface clientInterface{
     public foo();
     public bar();
}

public class yourClass implements clientInterface{
     public foo(){}
     public bar(){}

     public doSomethingElse(){}
}

public class clientSideFactory{
     public clientInterface getClass(){
               return new yourClass();
     }
}
public class internalSideFactory{
     public clientClass getClass(){
            return new yourClass();
     }
}
}

在上述情况下,即使您有接口clientInterface的单个实现(clientClass),返回到只应看到类的有限部分(限制类完整实现的可见性)的客户端类也是很有用的

我想补充另一点:界面帮助

在web应用程序中,此代理对抽象有很大帮助。我是web应用程序新手,但通常我是通过接口设计服务层的。在使用的web应用程序构建中,我有一个接口
Afrodite
和一个类
AfroditeImpl
,作为服务层,从applicationContext初始化为Springbean。然后,我们可以通过以下方式从所有网页中获取在
Afrodite
中定义并在
afroditimpl
中实现的所有方法:

AfroditeApplication application = (AfroditeApplication)getApplication();
Afrodite afrodite = application.getAfrodite();
// Now call the service layer's methods by afrodite
大纲是:

public interface Afrodite {

}

public class AfroditeImpl implements Afrodite {

}

public class AfroditeApplication extends WebApplication {

    Afrodite afrodite;

    public Afrodite getAfrodite() {
        return afrodite;
    }

    @Override
    public void init() {        
        super.init();
        ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());        
        afrodite = (Afrodite) applicationContext.getBean("afrodite");
    }
}

希望这能有所帮助。

我更喜欢stackoverflow答案,因为有很多优秀的编程人员会给你提供好的答案。可能是@Jigar Joshi的复制品:很好的链接,谢谢。我从没想过这一点。谢谢,我同意你的看法。如果我们只需要相同方法的实现,那么实现接口是没有意义的。但是,当您有许多类、许多方法和更改要做时,这是一个优势。想象一下,如果没有接口,那么要重写的代码就太多了!:请看我的答案。至少有一种情况是,即使没有更多的接口实现,也要证明接口本身的存在是合理的。即使保证不再有其他实现,在很多情况下,创建接口是有意义的,因为它可以使测试接口的具体实现的使用者变得更容易,因为他们可以使用依赖项注入来替代接口的更易于测试的实现。