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线程不安全

 

posted @ 2020-04-17 09:38  褐色键盘  阅读(94)  评论(0)    收藏  举报