Effective Java 第五六七章
泛型
请不要使用原生态类型
1 原生态类型:没有类型参数的泛型
2 使用原生态类型,就失掉了泛型在安全性和描述性方面的所有优势
消除非受检的警告
1 尽可能消除每一个非受检警告
2 如果确实无法消除警告,并且保证类型是安全的,可以用@suppressWarnings("unchecked")注解来禁止这条警告
列表优于数组
1 数组是协变的,如果a是b的子类型,那么a[]是b[]的子类型
2 泛型是可变的,如果a是b的子类型,但是list<a>不是list<b>的子类型
3 数组是具体化的,在运行时也知道它们的元素类型
4 泛型在编译时强化它们的类型信息,运行时擦除它们的元素类型信息
5 数组和泛型不能很好地混合使用
优先考虑泛型
优先考虑泛型方法
1 静态工具类尤其适合泛型化
利用有限制通配符来提升API的灵活性
1 为了获得最大限度的灵活性,要在表示生产者或者消费者的输入参数上使用通配符类型
谨慎并用泛型和可变参数
1 将值保存在泛型可变参数数组参数中是不安全的
优先考虑类型安全的异构容器
枚举和注解
用enum代替int常量
1 当需要一组固定常量,并且在编译时就知道其成员的时候,使用枚举
2 枚举可读性好,安全,功能更强大
用实例域代替序数
1 所有枚举都有ordinal方法,获取int序数,最好不要使用
用enumSet代替位域
用enumMap代替序数索引
注解优先于命名模式
坚持使用override注解
Lambda和Stream
Lambda优先于匿名类
1 lambda没有名称和文档,如果计算本身不是自描述的,或者超出了几行,就不要放在lambda中
2 不要给函数对象使用匿名类,除非必须创建非函数接口的类型实例
方法引用优先于lambda
1 只要方法引用更加简洁,就用方法引用
坚持使用标准的函数接口
1 java.util.function,优先考虑标准函数接口
2 始终用@Functionallnterface注解对自己编写的函数接口进行标注
谨慎使用stream
1 滥用stream会使代码更难读懂和维护
优先选择stream中无副作用的函数
1 forEach应该只用于报告stream计算的结果,而不是执行计算
stream要优先用collection作为返回类型
谨慎使用stream并行
1 如果源头是stream.iterate,或者使用了中间操作limit,那么并行pipeline也不会提升性能
2 在stream上通过并行获得性能,最好通过可以被精准,轻松地分成任意大小的子范围,使并行分工更轻松,比如数组,集合,map,int范围等
3 并行stream线程不安全

浙公网安备 33010602011771号