课时87:接口定义加强

简介: 接口最早的主要的一个特点是全部由抽象方法和全局常量组成,但是如果项目设计不当,就有可能出现非常严重的问题。1.接口设计不当2.观察普通方法定义3.在接口中定义Static方法

课时87:接口定义加强

摘要:接口最早的主要的一个特点是全部由抽象方法和全局常量组成,但是如果项目设计不当,就有可能出现非常严重的问题。

1.接口设计不当

2.观察普通方法定义

3.在接口中定义Static方法


01. 接口的不当设计

1.1早起接口设计原则

image.png

如上图所示,写了一个 IMessage 接口,如果只有一个子类的时候,当 IMessage 接口扩充的情况下,只需要在一个子类上去复写新方法即可;如果经过常年累月的发展,该接口的第1080个子类,这个时候突然发现接口的某个方法不足的时候,再次为接口追加新方法,并且这些方法实现相同,最早的设计就不合理了。


如果有1080个子类就意味着要把这方法在所有的子类上复写1080遍,最重要的是这方法的实现还一模一样。此时此刻对于任何一个开发者而言,重复拷贝1080遍,此操作都是一个不合理的操作,这就是一个不当设计,因此我们要避免这种问题的出现。


该操作是属于结构设计不当的结果,但是最初的时候任何人都不敢保证接口设计足够完善,在此情况下,为了方便子类的修改,我们往往不会让子类直接继承子类实现的接口,而是中间追加一个过度抽象类。

image.png

1.2 为什么要设计抽象类

为什么要加抽象类呢,其中有一个最重要的特点就是该类不能被直接实例化,在中间增加一个过度抽象类之后,假如发生了之前的问题,可以按照接下来的方式进行解决:如果要追加新方法,直接在抽象类中做出实现,最初实现之后,抽象类的所有子类不需要把所有的方法重复实现。


所以在最初写代码的时候,往往会通过这样的一个方案来解决关于接口功能扩充的一个操作方式,但是这种方案在JDK1.8之后改变了,从 JDK1.8 之后为了解决接口设计的缺陷,在接口之中允许开发者定义普通方法。

 

02.观察普通方法定义

 

普通方法是有严格要求的,举例来讲:首先定义一个 IMessage 接口,直接定义一个 Message 抽象方法,接下来定义一个 MessageImpl 类实现 IMessage 接口,再定义一个Message方法,该方法随便返回一个内容,比如“www.mldn.cn”这个网址。

image.png

现在直接执行JavaDemo,正常完成,如果按照传统方法来,突然增加一个方法,这方法对于当前子类即为复写,如果子类很多,那么就非常可怕。


在JDK1.8之后为了解决这个问题,比如该方法是一个公共方法,为Boolean类型的Connect()方法,所有类都具备,可以在Boolean前面增加Default,返回True,同时在此处写一个代码输出代码,打印输出“建立消息的发送通道。”,接下来在JavaDemo中:

if(msg.connect()){
System.out.println(msg.message())
},

image.png

因为增加了Default方法,再次编译仍然成功,所以这个代码说明的是,接口定义中除了抽象方法还有普通方法。接口中的普通方法必须追加Default声明,该方法属于挽救功能,所有在开发设计中不作为首选,最好的方式是在中间加上一个过度抽象类,因此过度抽象类不能直接实例化,并且可以提供普通方法。


除了可以追加普通方法之外,接口中还可以定义 Static 方法,而Static方法可以通过接口直接调用。

 

03. 在接口中定义Static方法

 

image.png

我们把Default去掉,在Message类中增加代码

if(this.connect()){
return “www.mldn.cn”
},
在 IMessage 接口中增加
public static  IMessage  getInstance(){ 
return new MessageImpl();//获得子类对象
}
Static的特点是在没有实例化之后即可直接调用,所以我们直接写
IMesage msg =  IMessage .getInstance();

随后正常进行消息的连接和发送,然后编译,程序再一次执行,成功返回,这就是Static方法,一旦项目增加了Static支撑之后,他的项目功能就会大大提升,可以取代抽象类方法。


但是不应该将这两个组成最为接口的主要设计原则,所写的代码还是应该奉行:接口就是抽象方法。全局常量的出现并不高,见得最对的就是抽象方法,其他的都是挽救原则,而不是设计原则。

相关文章
|
存储 分布式计算 监控
应用层---网络模型
应用层---网络模型
208 3
|
Kubernetes 容器 Perl
【kubernetes】解决:pvc 一直处于Terminating 无法删除的问题
【kubernetes】解决:pvc 一直处于Terminating 无法删除的问题
1582 0
|
数据可视化 IDE 定位技术
R语言与RStudio的下载与安装方法
R语言与RStudio的下载与安装方法
1241 1
|
消息中间件 存储 SQL
关于Lindorm Ganos
Lindorm 是阿里云推出的云原生超融合多模数据库,集成了宽表、时序、搜索、文件等多种引擎。深度融合的 Lindorm Ganos 时空数据库引擎,能够高效处理海量移动对象的存储、管理和查询需求,弥补了 NoSQL 数据库在时空数据处理上的不足。Ganos 具备原生时空数据类型、多层级索引能力和广适应兼容性,支持标准 SQL 语法,显著提升了计算效率和查询性能。相较传统方案,Ganos 在多种场景下性能提升 3-5 倍,并大幅降低存储计算成本。
443 0
|
7月前
|
人工智能 5G Windows
十分钟私有化部署DeepSeek R1
DeepSeek本地化部署支持下载1.5b、7b、8b、14b、32b等不同参数规模的大模型,适合逻辑推理和计算类问题。普通电脑建议选择1.5b模型以避免AI幻觉。部署需使用Ollama工具下载模型,并通过Chatbox AI等客户端进行配置,确保Ollama运行状态。显卡内存为主要资源占用,各模型占用情况不同,请确保硬盘空间充足。
953 11
|
安全 数据管理 定位技术
CDGA|自然资源数据治理五部曲,实现数据融合关联、共享可用
在自然资源行业,数据治理是自然资源信息化的工作基础,是推进自然资源治理体系和治理能力现代化进程的必经之路。
|
编解码
荔枝派Zero(全志V3S)开启mplayer,播放音视频
mplayer 是一款开源的多媒体播放器,可以用来播放音视频, mplayer 自带多种格式的解码器,不需要我们再另外安装。本文介绍如何在 荔枝派上移植 mplayer 播放器,基于音频驱动实验。
519 0
|
存储 弹性计算 监控
【阿里云弹性计算】成本优化实战:利用阿里云 ECS 抢占式实例节省云支出
【5月更文挑战第21天】阿里云ECS的抢占式实例提供了一种成本优化策略,适合对中断容忍度较高的业务。通过创建和管理抢占式实例,结合API查询价格信息,企业能节省大量成本。使用时注意业务容错性,设置监控系统应对中断,结合其他成本优化措施,如存储类型选择和网络配置优化。确保业务可恢复性,关注阿里云政策,并根据业务变化调整策略,以实现成本与效益的最佳平衡。
287 3
|
弹性计算 固态存储 大数据
2024年阿里云服务器租用费用_阿里云云服务器ECS价格表(2核2G - 8核64G)
阿里云服务器分为云服务器ECS和轻量应用服务器,云服务器s6公网带宽可选1M到5M,系统盘40G起可选高效云盘、SSD云盘或ESSD云盘,阿里云服务器租用费用,轻量应用服务器和云服务器ECS优惠价格表,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服务器30元3个月,幻兽帕鲁4核16G和8核32G服务器配置,云服务器ECS可以选择经济型e实例、通用算力u1实例、ECS计算型c7。
335 4
|
数据采集 缓存 前端开发
API揭秘:初学者的数据提取综合指南
API揭秘:初学者的数据提取综合指南
200 1