资讯详情

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

在Java准确使用接口的好例子将是理想的,适用于任何特定的规则。

看看丹以前的所有问题,他似乎只是一个字一个字地张贴家庭作业/考试问题。

令人惊讶的是,这些不是试题或其他问题…我今天才找到这个网站,所以我想我会在脑海中找到一些答案。谢谢你的回复。每个人都帮助我找到正确的方向。

已经有很多问题了。了搜索框,以防有人问过类似的问题?

集合框架值得一看。

java.util.List //interface

java.util.ArrayList //Concrete class

java.util.LinkedList //Concrete class

所以你可以这样写代码:

List l = new ArrayList();

l.add(..)

//do something else.

如果您希望将来使用以上内容LinkedList或您自己的AwesomeList which implements List实现接口变更,所以你要做的就是把第一行变成:

List l = new MyAwesomeList();

or

List l = new LinkedList();

其他代码将继续执行。

我知道这是一条旧线,但这让我很清楚。 1

这是理解接口的简单和最好的方法。

使用界面定义"第三方"供应商必须完全遵守和实施的应用程序编程合同(蓝图、接口)。这样,最终用户就可以根据API合同编码,可以在不更改代码的情况下轻松切换"在引擎盖下"。

JDBCAPI是一个很好的例子。它几乎只存在接口。具体实现作为"JDBC驱动程序"提供。这使你能够独立于数据库(DB)所有的都由供应商编写JDBC代码。只要你想切换DB可以更改供应商JDBC不改变任何驱动程序Java代码行(除了B特定的任何硬编码SQL代码)。

另一个例子是JavaEE API,它还包含相当多的接口和抽象类。提供具体实现"JavaEE应用服务器"、"ServelPosits"等,如Sun GalasFISH、Apache Tomcat等等。这样你就可以了WebApvices(WAR)部署任何你喜欢的东西Java Web服务器。

JDBCAPI这不是过时设计的例子吗?有很多界面没有人使用。DB供应商通常提供javax.sql一些实现,但实现连接池的库几乎从不使用,通常只需要Driver实现。现在真的有必要了Statement和PreparedStatement吗?设计一个应该有更好的方法ResultSet使用泛型可以减少接口getXX()和updateXXX()方法数量。

界面需要在预期波动、预期变化和设计需要弯曲的地方进行。

从这个意义上说,实现是脆弱的:很容易中断。这就是为什么子类化并不总是最好的解决方案,就像实现一些复杂行为的长期循环通常是坏主意一样。

接口更灵活,可以处理比实现更大的程序设计压力。

通过在程序中引入接口,您实际上引入了一些变化点,您可以将不同的实现插入到这些变化点中。接口的主要目的是抽象的"什么"与"如何"分离开来。

记住一个重要的规则,这是安全的利斯科夫替代原则[Unbebob,维基百科Java这种语言编译器将确保语法上的一切都有序(正确的参数、类型、……),LSP处理语义。简而言之,LSP说接口的每一个实现都必须(也)正确地表达自己,才能像上面描述的那样真正可替代。

谢谢你的回答!对于任何其他读过这篇文章的人来说:Unbebob链接已经死了,因为他有一个新的网站/域。然而,这篇文章仍然在他的谷歌硬盘上。通过搜索他的文章页面找到它

从Oracle文档页

如有以下情况,请考虑使用接口:

您希望不相关的类别实现您的接口。例如,许多不相关的对象可以实现可序列化接口。

您希望指定特定数据类型的行为,但不在乎谁实现了它。

您希望使用多种类型的继承。

用已经有很好答案的代码示例来看看相关的SE问题。

接口是否比正确的方法更重要?

接口和抽象有什么区别?

接口和抽象的区别应该如何解释?

试着理解战略设计模式

或命令模式

查看链接文本JDK收集教程。想想收藏品。你怎么想的?可以订购,也可以不订购,也可以有副本。

因此,集合是一个具有列表(有序)和设置(无序)为子接口的接口。如果列表是同步的/或不同步的,如果列表是链接的列表或不同步的,则列表中有许多问题。"行为"都有自己的界面/抽象。

集合中需要指定时"某些"抽象类需要在行为中使用。例如,所有集合(集合/列表等)都可以有一个"ToString"这意味着它只是迭代元素(有序/非有序)并串联起来。这种行为可以发生在"抽象集合"等中。

如果您遵循JDK层次结构的集合,理解接口和抽象的好地方:)

答案基本上和最酷的大脑一样,但在传达有用性时更清楚。

正如最酷的头所解释的,当你将来可能想要切换程序的可能子组件时,界面是有用的。它们还允许您更容易地分离程序结构各个部分的注意力,因为通过接口,您可以确保程序的其他部分看不到一些非相关类别。

例如,想读取任何数据并打印它,如下所示:

SomeReader someReader = new SomeReader();

String data = someReader.readLine();

System.out.println(data);

这里没什么特别的,对吧?但是,虽然这个例子很简单,但它已经绑定到了SomeReader类别,这意味着所有的变化都必须传播到你使用的类别,特别是在重建一些内部部分时!相反,你想这样做

IMyReader reader = new SomeReader();

System.out.println(reader.readLine());

现在打印代码不再关心具体的实现,只关心接口暴露的部分。这通常就足够了,因为现在你只需要切换一个new句子,可以得到新的实现,任何仍然按预期工作的实现(只要接口合同在实现类中得到尊重!)。当你最终多次使用一个特定的对象时,这是非常方便的——我只在这里使用一次,但事实上,如果你使用列表,通常需要执行多少个相同的列表?

因此,为了真正打破这个例子的比例,以下是您的代码最终可能会变成的样子

public class RowPrinter {

private final IMyReader reader;

public RowPrinter(IMyReader reader) {

this.reader = reader;

}

public void print() {

IMyReader reader = getReader();

System.out.println(reader.readLine());

}

protected IMyReader getReader() {

return reader;

}

}

注意到这部分与构造函数有关吗?这是控制逆转,让我告诉你,这是一个很酷的软件工程。根据经验,无论是从数据库产品切换到另一种产品,还是使代码的某些部分线程安全,都可以帮助您解决很多问题。或者,你可能只想在某个类别中添加一个日志记录层,使用包装装饰很容易实现,而包装装饰只是实现了与包装类别相同的接口。这只是开始。

界面带来了很多好处,通常从简单的例子中不那么明显,尽管简单的例子确实能让你正常工作。Java界面是一种语言结构,但实际上它们更像是一种编程范式,而不仅仅是单一语言的特征。在某些语言中,如果正确理解界面,模拟界面确实是有益的。

基本上,当需要的时候"忽略"有些细节可以在接口和抽象类之间选择。接口通常是更好的选择,因为客户机可以实现任何数量的接口,但它们只能有一个超级类别("继承是一种稀缺的资源",正如他们所说)。

为什么要抽象或接口?因为有时候,当你写算法时,你不在乎它的子步骤是如何完成的,但它是根据某个合同完成的。集合API就是一个例子,其中list当你使用它时,它是一个接口-通常List当你不在乎它是在数组中保存东西,还是在节点的链接列表中保存东西,或者以其他方式保存东西。只要把你放在里面的东西按照你放在那里的顺序放好,你就会很开心。

然后我们就有了AbstractList:一个实现List它提供了几乎所有成熟的抽象List实现需求,创造自己的List实现,你要做的就是扩展AbstractList并填充一些方法。这是一个很好的例子,当抽象是一个很好的选择——当你想提供一个几乎完全的实现,这只是缺乏客户代码填充的空白。

提示:如果您创建一个只包含抽象方法的抽象类,您可能应该创建其界面。

当您需要多个实现相同行为时,使用接口。以下是一个接口示例,显示它们都可以序列化XML。

public interface Xmlizable

{

public String toXML();

}

然后你就可以了"可xmlizable"接口传递给只关心该接口的方法。

在这个例子中,将军toXML您可以在传输到公共代码之前再次调用它。

远程通信接口:

接口还可用来定义一个商定的"协议",用于在系统的不同部分之间通信,可能通过远程调用。因此,接口只定义可以调用的内容、参数以及调用后返回的内容。例如,客户机使用接口,服务器实现具体的实际代码。

边注:

在爪哇中,只能从一个类中继承(扩展),但可以实现多个接口,因此有时需要使用多个继承的接口,并且在决定不使用构造函数继承时使用接口。

OOP的一个基本原则是信息隐藏:隐藏实现细节,只向调用者显示基本服务的描述。

Java必须为这个目标构建:接口和抽象类。您可以通过调用接口中定义的"可用方法",定义接口并编写代码,使其仅依赖于接口。

信息隐藏既可用于读取外部类(从某种意义上说是外部的,它在您正在编写的模块之外),这样您就可以定义您需要的方法,而无需推断其具体的实现类型,或者在定义可在类外使用的数据类型时,这是一个典型的示例,例如C像前面提到的那样,集合API或J2EE。

接口和抽象类都提供了这些细节——但是有两个主要的区别:接口支持多个继承,而抽象类可以保存基本实现。为了最大限度地提高效率,在定义接口时,还应该使用有意义的默认实现定义一个抽象类。如果接口的用户不需要扩展任何其他类,那么它可以扩展这个抽象类,否则它需要从接口实现所有方法。另一方面,确保不要直接读取这个抽象类,接口应该足够抽象。

每当您计划在某个开发点用另一个类替换一个实现类时,都要使用接口。

我还建议至少在更严肃的项目中使用继承接口中的所有类的接口后端:不幸的是,我不再有链接,但是语言Java的开发者曾经说过,包括类继承是设计语言时最大的错误。

这些参数非常好:使用适当的设计,总是可以用接口继承来替换类继承,并且在代码维护方面获得了很多好处。与类继承相比,保存自然类型关系(例如,从几何图形("正方形是矩形")更容易。

标签: 旧线网套连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司