小智 68
一个好看的地方是收藏框架.
java.util.List //interface
java.util.ArrayList //Concrete class
java.util.LinkedList //Concrete class
Run Code Online (Sandbox Code Playgroud)
所以你可以写这样的代码:
List l = new ArrayList();
l.add(..)
//do something else.
Run Code Online (Sandbox Code Playgroud)
如果将来你想用say LinkedList
或你自己的AwesomeList which implements List
界面改变实现,你所要做的就是将第一行更改为:
List l = new MyAwesomeList();
or
List l = new LinkedList();
Run Code Online (Sandbox Code Playgroud)
其余的代码将贯彻执行.
Bal*_*usC 35
使用接口来定义应用程序编程合同(蓝图,接口),"第三方"供应商必须完全遵守和实施.通过这种方式,最终用户可以只针对API合同进行编码,并在不改变代码的情况下轻松切换"引擎盖下"的具体实现.
该JDBC API是一个很好的例子.它几乎只存在接口.具体实现提供为"JDBC驱动程序".这使您可以独立于数据库(DB)供应商编写所有JDBC代码.只要您想切换数据库供应商,就可以更改JDBC驱动程序而无需更改任何Java代码行(任何硬编码的特定于DB的SQL代码除外).
另一个例子是Java EE API,它还包含很多接口和抽象类.具体实现提供为"Java EE应用程序服务器","Servletcontainers"等,例如Sun Glassfish,Apache Tomcat等.这使您可以将Web应用程序(WAR)部署到您喜欢的任何Java Web服务器.
elj*_*nso 14
如果您希望程序中的波动性,预期变化的点,设计需要弯曲的点,则需要接口.
从这个意义上说,实施是脆弱的:它很容易打破.这就是为什么子类化并不总是最好的解决方案,正如实现一些复杂行为的冗长方法一般都是一个坏主意.
接口更灵活,可以处理程序设计上比实现更多的压力.
通过在程序中引入接口,您真正引入了变量点,您可以在其中插入该接口的不同实现.接口的主要目的是抽象,将"什么"与"如何"脱钩.
Liskov替代原则 [ UncleBob,Wikipedia ] 要记住安全这样做的一条重要规则.虽然像Java这样的语言的编译器将确保语法上的所有内容都是有序的(正确数量的参数,类型......),但LSP处理语义.简而言之,LSP表示接口的每个实现必须(也)正确地表现为真正可替代,如上所述.
来自oracle文档页面
考虑使用接口:
看看相关的SE问题和代码示例已经有了很好的答案.
我该如何解释Interface和Abstract类之间的区别?