“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

435 阅读6分钟
原文链接: www.toutiao.com

难度

初级

学习时间

60分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

提示

本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。

1.接口中嵌套接口

我们先来回顾一下接口中嵌套接口的样子。

演示:

请定义一个外部接口IOuter,然后在外部接口IOuter中定义一个嵌套接口IInner。

代码:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

2.接口中嵌套接口应用场景

什么情况下我们会在接口中嵌套接口呢?

这里我总结有三种情况:

第一种:将同一类接口归属到一个接口下。

第二种:连接接口中的内部类。

第三种:作为静态常量而存在(嵌套接口的匿名内部类)。

这三种情况我分别分小节来讲解。

3.第一种:将同一类接口归属到一个接口下

还记得上一章中点击事件吗?不记得同学或者没有看过的同学可以点击下面文章阅读:

“全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)

回顾一下Button类:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

如果大家看不清,可以单独来看这两个嵌套接口:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

它们两个都属于点击事件,只不过一个是单击一个是长按。它们可以归属为同类接口,自然而然可以归属到同一个接口下,我们提出去试试:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

Button类自然也改变了:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

不变的是Main类:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

运行程序,执行结果:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

从运行结果来看,结果正确,和之前的一样。

为什么我们觉得单击事件和长按事件可以提出去?

因为它们两个是一类接口,都是触摸屏幕产生的协议,手按下去1秒,抬起来产生单击效果;手按下去持续3秒及以上,产生长按效果。它们都是可以归属到触摸协议下。

提醒

虽然接口中可以定义嵌套接口,但是有时候还是慎用,如果能将嵌套接口定义在类中,则建议优先定义在类中,否则定义在接口中。

4.第二种:连接接口中的内部类

这种情况需要结合内部类来说,这个内部类不是定义在类中的,而是定义在接口中的。

举一个例子,我们需要一个对文字进行处理的功能。

首先,请问大家面对这样的一个需求是定义类还是定义接口?

有人说定义类,也有人说定义接口。先说定义类:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

这样定义以后,大家是不是觉得有点不妥啊,处理文字可以是小写转大写,或者是大写转小写还有切割文字。

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

这种做法很不妥,将来如果还有更多的关于文字处理的功能怎么办?一直加方法吗?这种做法显然不行,我们需要将这三个方法抽取一下。既然要抽取公共部分,那么就意味着必然有一个抽象方法,有抽象方法必然有抽象类或接口。

我们先把公共方法抽取出来:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

这样的话,意味着WordProcessingService抽象类需要被继承,实现其中的抽象方法。按照转大写、转小写和切割文字的三个功能来说,分别需要三个不同的类去继承WordProcessingService抽象类并实现process()方法。

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

转大写、转小写和切割文字都属于文字处理功能,故可以将分别实现的三个类归属到WordProcessingService类下。也就是三个内部类,上面我们还没有继承WordProcessingService抽象类,不能继承,一旦继承就形成循环继承错误。意味着,我们要把process()抽象方法单独封装到抽象内部类或嵌套接口中去。

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

为什么这里使用接口?因为我们需要将三个内部类连接起来,抽象类有单继承局限性。

这样的话,我们再把WordProcessingService抽象类改为接口就完美了:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

我们简单的来看一下程序,有一个嵌套接口TextProcessor:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

还有三个内部类:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

其中最后一个Splitter实现TextProcessor接口时,做了一个小小的改动,前面我们的Splitter类里面process()方法是接受两个参数,现在为了实现TextProcessor接口改为一个。

我们来看看效果。

Main类:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

运行程序,执行结果:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

从运行结果来看,程序本身没有错误。

该程序有一点策略设计模式的影子。后面我们讲解Java设计模式的时候也会讲解到策略设计模式。

5.第三种:作为静态常量而存在(嵌套接口的匿名内部类)

最后一种情况,我们就直接将上一小节例子进行改写。

在WordProcessingService接口中,将内部类都改写为匿名内部类作为静态常量。

话不多说,先看代码。WordProcessingService接口:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

简单的来看一下WordProcessingService接口,内部有一个嵌套接口TextProcessor:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

和上一小节的嵌套接口一样。不过,不一样的就是没有内部类去实现该接口了,改为匿名内部类了:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

该匿名内部类也是作为静态常量存在。

既然这样的话,我们的Main类也是需要改变的:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

重点是之前是new三个内部类对象,现在是三个静态常量对象:

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

其实这种方式相比较内部类方式而言都有各自的优劣势。匿名内部类方式更直接。内部类方式更灵活,可定义的成员更多。

提醒

接口中嵌套接口的应用场景不常见,大家可以根据自己的需求而选择。建议大家多多使用外部类搭配内部类和嵌套接口结合体。

总结

  • 第一种:将同一类接口归属到一个接口下。
  • 第二种:连接接口中的内部类。
  • 第三种:作为静态常量而存在(嵌套接口的匿名内部类)。

至此,Java中接口中嵌套接口的应用场景相关内容讲解先告一段落,更多内容请持续关注。

附:接口学习资料

“全栈2019”Java第六十章:如何定义接口

“全栈2019”Java第六十一章:如何实现接口?

“全栈2019”Java第六十二章:接口与常量详解

“全栈2019”Java第六十三章:接口与抽象方法详解

“全栈2019”Java第六十四章:接口与静态方法详解

“全栈2019”Java第六十五章:接口与默认方法详解

“全栈2019”Java第六十六章:抽象类与接口详细对比

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

“全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)

下一章

“全栈2019”Java第八十九章:接口中能定义内部类吗?

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

版权声明

原创不易,未经允许不得转载!