《Effective java 第2版》读书笔记--泛型与枚举

来源:互联网 发布:java音乐播放器源代码 编辑:程序博客网 时间:2024/06/05 06:27

第五章 泛型


第二十三条:不要在新代码中使用原生态类型

1.泛型的原生态类型:

List对应的是不带任何实际参数类型的List

2.泛型的优点:

(1)插入元素时自带类型检查

(2)删除元素是不需要进行手工转换

(3)可以使用for-each循环,两种方法

3.缺点

(1)使用原生态类型,会失掉泛型在安全性和表述性方面所有的优势

(2)List与List的区别:前者可以接受List,但是后者不行

(3)不确定类型的时候,应该使用无限制的通配符类型,而不是原生态类型,例如Set< ?>。 Collection< ?>不能将任何元素放入其中,因为不能确定类型。

4.例外

(1)类文字中必须使用原生态类型,比如List.class

(2)泛型信息会在运行时被擦除,所以在instanceof后面可以使用Set


第二十四条:消除非受检警告:unchecked warning

1.如果无法消除警告,同时可以证明引起警告的代码是类型安全的。

那么可以使用@SupressWarnings(“unchecked”)来禁止警告。
必须在每次使用这条注解的后面加注释,说明为什么要这么做

2.应该始终在尽可能小的范围内使用SupressWarnings注解,

永远不要在整个类上使用这条注解

3.Return不能使用这条注解。

应该声明一个局部变量并注解


第二十五条:列表优先于数组

1.数组是协变的、具体化的,而泛型是不可变的且可以被擦除。

2.创建泛型数组是非法的,并非类型安全,会抛出ClassCastException异常

但是创建List< ?>或者Map< ?,?>的数组是合法的


第二十六条:优先考虑泛型

1.泛型Stack类的应用

2.不能创建基本类型的泛型,可以通过装箱基本类型来实现。


第二十七条:优先考虑泛型方法

1.泛型方法的特性:

无需明确指定类型参数的值,不像调用泛型构造器一样。

(1)泛型单例工厂创建许多不可变但适合于多个不同的对象,需要编写一个静态方法,重复的给每个必要的类型参数分发对象。

(2)递归类型限制:通过某个包含该类型本身的表达式来限制类型参数。


第二十八条:利用有限制通配符来提升API的灵活性

1.助记符:PECS

producer extends;consumer super。

Extends:生产数据给方法所在的实例;super:从实例(消费者)获得数据
注:所有的comparable和 comparator都是消费者。

2.无限制的通配符与无限制的类型参数

(1)如果类型参数只出现一次,那就应该使用通配符

(2)无限制的类型参数阻止调用者将任何非null的元素加入已有集合。

即List

第六章 注解与枚举


第三十条:用enum常量代替int常量

1.使用枚举的情况:

需要一组固定常量,或者编译时就知道所有可能值的集合

2.使用策略枚举的情况:

如果多个常量共享相同的行为, 可以考虑策略枚举.


第三十一条: 用实例域代替序数

1.注意

(1)永远不要根据枚举的序数导出与它关联的值, 而是将它保留在一个实例域中.

(2)永远不要使用ordinal()来获得序数。所有的序数都应该保存在实例域里

(3)Ordinal()用在enumSet这样的类中,如果不编写这样的类就不要使用这个函数


第三十二条:用EnumSet代替位域

1.位域的不足之处:

(1)使用方便性和类型安全方面没帮助

(2)没法把枚举常量打印或者遍历:

2.使用EnumSet更加灵活


第三十三条:用EnumMap代替序数索引

1.注意

(1)用EnumMap改写过的版本没有安全转换,不会出现索引问题

(2)若表示的关系是多维的,就使用EnumMap< … ,EnumMap<…> >

(3)避免使用Enum.ordinal


第三十四条: 使用接口模拟可伸缩的枚举

1.注意:

(1)定义一个枚举类型,他实现这个接口,并用这个类型的实例代替基本类型。

(2)虽然无法编写可扩展的枚举类型,却可以通过编写接口以及实现该接口的基础类型对他进行模拟。


第三十五条: 注解优先于命名模式

1.命名模式的缺点

(1)拼写错误会导致失败而且没有任何提示。

(2)命名模式不能用在特定的程序元素上。

(3)命名模式不能把参数值和程序元素关联起来。

2. 注解

它永远不会改变被注解代码的语义, 但他们可以通过工具进行特殊的处理.


第三十六条:坚持使用override注解

1.注意

(1)在每个方法声明中使用@override注解来覆盖超类声明。

(2)覆盖接口时也最好加注解,这样能防止添加新方法。

(3)在具体的类中,不必标注你确信覆盖了抽象方法声明的方法。


第三十七条:用标记接口定义类型

1.标记接口的定义:

(1)标记接口是没有包含方法声明的接口。例子:Serializable接口

(2)标记接口可以不改进任何方法的契约,只表示整个对象的限制条件。

2.标记接口相对于标记注解的优势

(1)标记接口定义的类型是由被标记类的实例实现的;标记接口没有定义这样的类型

(2)标记接口可以被更加精确的锁定

3.标记注解的优势

(1)可以通过默认的方法添加一个或者多个注解类型元素,给被使用的注解类型添加更多的信息

(2)它们是更大注解机制的一部分,在支持注解的框架中具有一致性

4.适用场合

(1)如果标记是应用在任何程序元素而非类或者接口,那么应该使用注解。

(2)如果标记永远只用于限制特殊元素的接口,那么应该使用标记接口。




本人才疏学浅,若有错,请指出
谢谢!

0 0