我什么时候应该在java中使用接口?

Jul*_*lio 50 java interface

准确地在Java中使用接口的一个很好的例子将是理想的,并且适用于任何特定的规则.

小智 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)

其余的代码将贯彻执行.

  • 我知道这是一个老话题,但这对我来说非常清楚.+1 (7认同)
  • 这是理解接口的简单且最好的方法。 (2认同)
  • 为什么List不能是抽象类而不是接口? (2认同)

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表示接口的每个实现必须(也)正确地表现为真正可替代,如上所述.


Rav*_*abu 6

来自oracle文档页面

考虑使用接口:

  1. 您希望不相关的类可以实现您的接口.例如,许多不相关的对象可以实现Serializable接口.
  2. 您希望指定特定数据类型的行为,但不关心谁实现其行为.
  3. 您希望利用类型的多重继承.

看看相关的SE问题和代码示例已经有了很好的答案.

接口是否比使用正确的方法更多

接口和抽象类之间有什么区别?

我该如何解释Interface和Abstract类之间的区别?