难度
初级
学习时间
60分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.接口中嵌套接口
我们先来回顾一下接口中嵌套接口的样子。
演示:
请定义一个外部接口IOuter,然后在外部接口IOuter中定义一个嵌套接口IInner。
代码:
2.接口中嵌套接口应用场景
什么情况下我们会在接口中嵌套接口呢?
这里我总结有三种情况:
第一种:将同一类接口归属到一个接口下。
第二种:连接接口中的内部类。
第三种:作为静态常量而存在(嵌套接口的匿名内部类)。
这三种情况我分别分小节来讲解。
3.第一种:将同一类接口归属到一个接口下
还记得上一章中点击事件吗?不记得同学或者没有看过的同学可以点击下面文章阅读:
“全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)
回顾一下Button类:
如果大家看不清,可以单独来看这两个嵌套接口:
它们两个都属于点击事件,只不过一个是单击一个是长按。它们可以归属为同类接口,自然而然可以归属到同一个接口下,我们提出去试试:
Button类自然也改变了:
不变的是Main类:
运行程序,执行结果:
从运行结果来看,结果正确,和之前的一样。
为什么我们觉得单击事件和长按事件可以提出去?
因为它们两个是一类接口,都是触摸屏幕产生的协议,手按下去1秒,抬起来产生单击效果;手按下去持续3秒及以上,产生长按效果。它们都是可以归属到触摸协议下。
提醒
虽然接口中可以定义嵌套接口,但是有时候还是慎用,如果能将嵌套接口定义在类中,则建议优先定义在类中,否则定义在接口中。
4.第二种:连接接口中的内部类
这种情况需要结合内部类来说,这个内部类不是定义在类中的,而是定义在接口中的。
举一个例子,我们需要一个对文字进行处理的功能。
首先,请问大家面对这样的一个需求是定义类还是定义接口?
有人说定义类,也有人说定义接口。先说定义类:
这样定义以后,大家是不是觉得有点不妥啊,处理文字可以是小写转大写,或者是大写转小写还有切割文字。
这种做法很不妥,将来如果还有更多的关于文字处理的功能怎么办?一直加方法吗?这种做法显然不行,我们需要将这三个方法抽取一下。既然要抽取公共部分,那么就意味着必然有一个抽象方法,有抽象方法必然有抽象类或接口。
我们先把公共方法抽取出来:
这样的话,意味着WordProcessingService抽象类需要被继承,实现其中的抽象方法。按照转大写、转小写和切割文字的三个功能来说,分别需要三个不同的类去继承WordProcessingService抽象类并实现process()方法。
转大写、转小写和切割文字都属于文字处理功能,故可以将分别实现的三个类归属到WordProcessingService类下。也就是三个内部类,上面我们还没有继承WordProcessingService抽象类,不能继承,一旦继承就形成循环继承错误。意味着,我们要把process()抽象方法单独封装到抽象内部类或嵌套接口中去。
为什么这里使用接口?因为我们需要将三个内部类连接起来,抽象类有单继承局限性。
这样的话,我们再把WordProcessingService抽象类改为接口就完美了:
我们简单的来看一下程序,有一个嵌套接口TextProcessor:
还有三个内部类:
其中最后一个Splitter实现TextProcessor接口时,做了一个小小的改动,前面我们的Splitter类里面process()方法是接受两个参数,现在为了实现TextProcessor接口改为一个。
我们来看看效果。
Main类:
运行程序,执行结果:
从运行结果来看,程序本身没有错误。
该程序有一点策略设计模式的影子。后面我们讲解Java设计模式的时候也会讲解到策略设计模式。
5.第三种:作为静态常量而存在(嵌套接口的匿名内部类)
最后一种情况,我们就直接将上一小节例子进行改写。
在WordProcessingService接口中,将内部类都改写为匿名内部类作为静态常量。
话不多说,先看代码。WordProcessingService接口:
简单的来看一下WordProcessingService接口,内部有一个嵌套接口TextProcessor:
和上一小节的嵌套接口一样。不过,不一样的就是没有内部类去实现该接口了,改为匿名内部类了:
该匿名内部类也是作为静态常量存在。
既然这样的话,我们的Main类也是需要改变的:
重点是之前是new三个内部类对象,现在是三个静态常量对象:
其实这种方式相比较内部类方式而言都有各自的优劣势。匿名内部类方式更直接。内部类方式更灵活,可定义的成员更多。
提醒
接口中嵌套接口的应用场景不常见,大家可以根据自己的需求而选择。建议大家多多使用外部类搭配内部类和嵌套接口结合体。
总结
- 第一种:将同一类接口归属到一个接口下。
- 第二种:连接接口中的内部类。
- 第三种:作为静态常量而存在(嵌套接口的匿名内部类)。
至此,Java中接口中嵌套接口的应用场景相关内容讲解先告一段落,更多内容请持续关注。
附:接口学习资料
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
“全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)
下一章
“全栈2019”Java第八十九章:接口中能定义内部类吗?
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!