第24条 静态成员类优于非静态成员类
这一节探讨的是不同内部类之间的使用场景
嵌套类的分类(感觉不是那么重要,但是需要简单知道一下):
image.png静态成员类
- 如果声明成员类不要求访问外围实例,就要始终把static修饰符放在它的声明中,使它成为静态成员类。
- 作为公有的辅助类,仅当与它的外部类一起使用时才有意义
- 常见的使用场景:代表外围类所代表的对象的组件。(Map.Entry)
非静态成员类
- 非静态成员类的每个实例都隐含着与外围类的一个实例相关联。保存这份引用消耗时间和空间,并且会导致外围实例在符合垃圾回收时却仍然得以保留
- 如果嵌套类的实例可以在它外围类的实例之外独立存在,这个嵌套类就必须是静态成员类
- 常见的使用场景:
iterator
匿名类
常见用法:
- 创建函数对象. 如匿名的Comparator实例.
- 创建过程对象. 如Runnable, Thread或者TimerTask实例.
- 在静态工厂方法的内部.
局部类
局部类并不是很常用,就不介绍了
思考
- 区分使用静态内部类和非静态内部类的场景,就是看是否可以独立于外部类存在。更为直观的区分方法就是一个内部类如果是外部的组件的话,就是静态的。比如
HashMap
里面的Node
,HashMap
的数据存储都是靠Node
实现的,Node
类就是一个静态内部类 - 尽量不要使用非静态内部类,考虑到隐藏的引用。而且非静态内部类可以用
Wrapper
的方式类实现。比如Iterator
,就可以造一个ListIterator(List<T> list)
,然后next()
和hasNext
就可以通过调用List
的方法来实现 - 匿名类是一个比较好用的东西,它的优势在于可以减少变量的作用域。比如有一个业务,需要一个方法多线程跑。其实只有这一个小的地方会用到,如果单独造一个类出来的话有点浪费,所以就可以使用匿名类。这样的话也可以相对的提高编译的效率
第25条 限制源文件为单个顶级类
一个java文件只定义一个顶层类
网友评论