Java内部类

Posted daidao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java内部类相关的知识,希望对你有一定的参考价值。

摘抄自知乎https://www.zhihu.com/question/21373020

一个很重要的设计准则是:设计是做减法,能不用模式就不用模式。这个准则对内部类来说同样适用。

所以能不用内部类就不用内部类。

以前觉得内部类用来有针对性地暴露外部类的特定接口,比一下子把整个对象都给人家要好。

比如说下面代码中的外部类Outer实现了三个接口方法,能跑,能飞,能思考。

然后有三个方法getRunner(),getFlyer(),getThinker()有针对性地对外暴露部分功能接口。


但实际上直接实现三个接口不是就很好嘛。用内部类根本算不上优雅,多了很多代码。
仅仅为了暴露接口根本不需要使用内部类。

再或者说常见的控制框架。我们定义个Event接口,必须有action()方法。在外部类里定义事件处理的流程。

然后定义了几个实现Event接口的内部类。

但这也不是非内部类不可。独立定义A,B类,最后再把Event对象组合到Controller里完全可以,而且更简洁易读。

另外,说到内部类,经常会提到闭包,回调。但内部类也不是唯一的方案。

简单的继承,组合都能实现同等的数据封装效果。

还是有很多情况,没有内部类是处理不了的,或者用内部类处理起来更加优雅。

还是第一个例子。如果外部类不止有一种接口实现方法。如果我实现了Runnable接口,就只能定义一个run()方法。这时候内部类就派用场了。

比如,企鹅既会跑,又会游泳。所以它的两个内部类实现两种不同的run()。可以返回两种不同的Runnable引用。

另一种典型场景就是多继承。如果外部类已经继承了某个基类,比如说企鹅继承自鸟类。

但Runnable这时候正好是一个abstract抽象类呢?Java不支持多继承,内部类可以解决这个问题。

刚才提到了控制框架可以不用内部类。但实际上你看看事件驱动的Swing里到处都是内部类。

为什么呢?因为有大量的事件,而且多数事件的相应方法只被用到了一次。

用内部类是为了控制类的数量,考虑的是更好地封装。内部类另外一个好的特性就是它独立于外部类,

不会像组合一样随着外部类的初始化而一起被初始化。

而是在我们需要它的时候再创建它。比如说容器里的迭代器,需要我们手动创建。作为可选组件存在于外部类中,

不会增加外部类的负担。总之,要知道什么时候真正需要内部类,先要搞清楚什么时候可以不用内部类。

内部类不是大力丸,不要滥用内部类。

 

 

 

以上是关于Java内部类的主要内容,如果未能解决你的问题,请参考以下文章

# Java 常用代码片段

# Java 常用代码片段

elasticsearch代码片段,及工具类SearchEsUtil.java

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏

为啥片段类应该是公开的?

ForegroundService没有从片段开始?