为后代设计接口

在 Java 8 之前,不可能在不破坏现有实现的情况下为接口添加方法。 如果向接口添加了一个新方法,现有的实现通常会缺少该方法,从而导致编译时错误。 在 Java 8 中,添加了默认方法(default method)构造[JLS 9.4],目的是允许将方法添加到现有的接口。 但是增加新的方法到现有的接口是充满风险的。

  默认方法的声明包含一个默认实现,该方法允许实现接口的类直接使用,而不必实现默认方法。 虽然在 Java 中添加默认方法可以将方法添加到现有接口,但不能保证这些方法可以在所有已有的实现中使用。 默认的方法被「注入(injected)」到现有的实现中,没有经过实现类的知道或同意。 在 Java 8 之前,这些实现是用默认的接口编写的,它们的接口永远不会获得任何新的方法。

 在默认方法的情况下,接口的现有实现类可以在没有错误或警告的情况下编译,但在运行时会失败。 虽然不是非常普遍,但这个问题也不是一个孤立的事件。 在 Java 8 中添加到集合接口的一些方法已知是易受影响的,并且已知一些现有的实现会受到影响。

  应该避免使用默认方法向现有的接口添加新的方法,除非这个需要是关键的,在这种情况下,你应该仔细考虑,以确定现有的接口实现是否会被默认的方法实现所破坏。然而,默认方法对于在创建接口时提供标准的方法实现非常有用,以减轻实现接口的任务(详见第 20 条)。

  还值得注意的是,默认方法不是被用来设计,来支持从接口中移除方法或者改变现有方法的签名的目的。在不破坏现有客户端的情况下,这些接口都不可能发生更改。

  准则是清楚的。 尽管默认方法现在是 Java 平台的一部分,但是非常悉心地设计接口仍然是非常重要的。 虽然默认方法可以将方法添加到现有的接口,但这样做有很大的风险。 如果一个接口包含一个小缺陷,可能会永远惹怒用户。 如果一个接口严重缺陷,可能会破坏包含它的 API。

  因此,在发布之前测试每个新接口是非常重要的。 多个程序员应该以不同的方式实现每个接口。 至少,你应该准备三种不同的实现。 编写多个使用每个新接口的实例来执行各种任务的客户端程序同样重要。 这将大大确保每个接口都能满足其所有的预期用途。 这些步骤将允许你在发布之前发现接口中的缺陷,但仍然可以轻松地修正它们。 虽然在接口被发布后可能会修正一些存在的缺陷,但不要太指望这一点。

原文地址:https://www.cnblogs.com/lIllIll/p/12702794.html

时间: 2024-10-01 06:45:04

为后代设计接口的相关文章

Effective Java 第三版——21. 为后代设计接口

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 21. 为后代设计接口 在Java 8之前,不可能在不破坏现有实现的情况下为接口添加方法. 如果向接口添加了一个新方法,现有的实现通常会缺少该方法,从而导致编译时错误. 在

怎样设计接口?

怎样设计接口? 众所周知,接口是提供给其它模块或者系统使用的一种约定或者规范.因此接口必需要保证足够的稳定性和易用性.这是设计接口的基本要求. 1.稳定性 接口必须相对稳定,否则将导致接口的使用者和提供者为了适应新接口而不断改动接口的实现,可能反复进行无用功,严重时影响整个软件开发进度.那么怎样保证设计的接口相对稳定呢?    首先,接口的语义必须明白.包含接口调用方法.接口名称.參数的类型和名称.抽象的接口名称或者參数名称使人困惑或者理解错误.例如以下例:    History::SetAtt

设计接口的一些想法.

一.标准化接口返回值 设计接口框架中一个很重要的东西就是接口规则. 每个接口的返回值或回调函数最好统一一个标准,后台方便输出,前端方便接收判断. 比如说: { ok: 1 code: 200 data: [ ] } 定义好OK.code的意义,前端就知道了返回信息的类型代表了什么.而data或其他字段则可以做为特定数据

如何设计接口原则?

如何设计接口? 众所周知,接口是提供给其他模块或者系统使用的一种约定或者规范.因此接口必须要保证足够的稳定性和易用性.这是设计接口的基本要求. 1.稳定性 接口必须相对稳定,否则将导致接口的使用者和提供者为了适应新接口而不断修改接口的实现,可能重复进行无用功,严重时影响整个软件开发进度.那么如何保证设计的接口相对稳定呢?    首先,接口的语义必须明确.包括接口调用方法.接口名称.参数的类型和名称.抽象的接口名称或者参数名称使人困惑或者理解错误.如下例:    History::SetAttri

如何设计接口测试用例

接口测试是项目测试的一部分,正如其名,它测试的主要对象是接口,是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与所测系统之间以及内部各系统之间的交互点.测试的重点是检查数据交互.传递.和控制管理过程以及系统间的相互依赖关系等. 如何设计接口测试用例? 首先,明确出发点.和所有的测试一样,接口测试出发点是你要证明所测的程序是错误的.以这个出发点为导向,你的设计行为就会尽量朝这个方向发展,更易发现问题,不会出现大方向的偏差. 其次,选择好测试对象.对于一个系统做接口测试选择好的测试对象是

App架构设计:接口的设计

安全机制的设计 现在,大部分App的接口都采用RESTful架构,RESTFul最重要的一个设计原则就是,客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息.实现上,大部分都采用token的认证方式,一般流程是: 用户用密码登录成功后,服务器返回token给客户端: 客户端将token保存在本地,发起后续的相关请求时,将token发回给服务器: 服务器检查token的有效性,有效则返回数据,若无效,分两种情况: token错误,这时需要用户重新登

如何简单设计接口测试用例

接口测试是项目测试的一部分,它测试的主要对象是接口 ,是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与所测系统之间以及内部各系统之间的交互点.测试的重点是检查数据交互.传递.和控制管理过程以及系统间的相互依赖关系等. 如何设计接口测试用例?首先,明确出发点,和所有的测试一样 ,接口测试出发点是你要证明所测的程序是错误的.以这个出发点为导向,你的设计行为就会尽量朝这个方向,更易发现问题 其次,选择好测试对象.对于一个系统做接口测试选择好的测试对象是接口测试关键.一个系统有无数的接口

怎么设计接口测试用例?

一.简介 在开始接口测试之前,我们想一下,接口测试的流程是什么?说到这里,有些人就会产生好奇和疑问,心里mmp:接口测试要什么流程哈???不就是参考接口文档,直接利用接口测试工具(例如jmeter和postman)测试...其实,如果一个project中,只是几个接口,你完全可以做临时的接口测试,但project可不止几个接口,少则几十条接口,多则成百上千接口.另外,如果你公司的这个项目,第一次做接口测试.而且古人说过:“无规矩不成方圆.”所以哈,我们还是有必要严格遵守接口测试的流程. 二.接口

如何设计接口

根据资料和经验总结. 要求: 命名: 命名规则和风格统一.规范: 命名清晰明确,不冗余,不模糊: 有意义:清晰和有意义的命名比简略而模糊的命名更应受到青睐: 功能 职责明确:功能尽量单一: 充分理由:不要随便有新功能就增加新接口:无意义的接口只会增加维护的难度: 将功能层和策略层分开: 功能是基础数据,不易变: 策略是表层数据,易变--策略可以使用参数修改: 低耦合:减少不同接口间的依赖. 一个接口不应随着另一个接口的变化而变化: 一个接口不应以某几个接口为前提而存在. 完备性: 考虑各种参数变