枚举和注解
2016-10-10 本文已影响238人
求闲居士
30,用enum代替int常量
枚举类型是指由一组固定的常量组成合法值的类型。
与int常量相比,枚举的优势是不言而喻的。
- 枚举要易读的多,也更加安全,功能更强大。
- 许多枚举都不需要显式的构造器或者成员,但许多其他枚举则收益于“每个常量与属性关联”以及“提供行为受这个属性影响的方法”。
- 只有极少数枚举受益于将多中行为与单个方法关联。在这种相对少见的情况下,特定于常量的方法要优先于启用自有价值的枚举。
- 如果多个枚举常量同时共享相同的行为,则考虑策略枚举。
31,用实例域代替序数
所有的枚举都有一个ordinal方法,它返回每个枚举常量在类型中的数字的位置。它是设计成用于像EnumSet和EnumMap这种基于枚举的通用数据结构的。
永远不要根据枚举的序列数导出与它有关的值,而是要把它保存在一个实例域中。
32,用EnumSet代替位域
这种表示法让你用OR位运算将几个常量合并到一个集合中,称作位域。
比如,某个方法通过参数获取类的一个常量。有些像从Map中通过key获取值。
java.util包提供了EnumSet类来有效地表示从单个枚举类型中提取多个值的多个集合。
33,用EnumMap代替序数索引
如果你所表示的这种关系是多维的,就使用EnumMap<..., EnumMap<...>>。应用程序在一般情况下都不使用Enum.ordinal,即使要用也很少,因此这是一种特使情况。
34,用接口模拟可伸缩的枚举
枚举类型可以通过给操作码类型和(属于接口的标准实现的)枚举定义接口,来实现任意接口。
例如,假设你想要定义一个上述操作类型的扩展,由求幂和求和操作组成。你所要做的就是编写一个枚举类型,让他实现接口。
35,注解优先于命令模式
36,坚持使用@Override注解
它表示注解的方法声明覆盖了超类型中的一个声明。
37,用标记接口定义类型
标记接口(marker interface)是没有保护方法声明的接口,而只指明(或者标明)一个类实现了具有某种属性的接口。例如Serializable接口
- 如果想要定义一个任何新方法都不会与之关联的类型,标记接口就是最好的选择。
- 如果想要标记程序元素而非类和接口,考虑到未来可能要标记添加更多信息,或者标记要适合于已经广泛使用了注释类型的框架,那么标记注解就是正确的选择。
- 如果你发现自己再编写的是目标为ElementType.TYPE的标记注解类型,就要花点时间考虑清楚,它是否真的应该为注解类型,想想标记接口是否会更加合适呢。
- 如果想要第一类型,一定要使用接口。