Effective java中对于枚举的建议

枚举和注解

1.用enum代替int常量

       以前的int枚举类型(public static final int APPLE_FUJI = 0)不具有安全性,也没有描述性。Int枚举是编译时常量,很难将int枚举常量转换为可打印的字符串,还有一种变体就是String类型的(淘汰)
       简单的枚举类型
       Public enum Apple{FUJI,PIPPIN,GRANNY_SMITH}
       Java枚举本质上是int值
       枚举类型是实例受控的,他们是单例(singleton)的泛型化,本质上是单元素的枚举
       枚举类型保证了编译时的类型安全。
       包含同名常量的多个枚举类型可以在一个系统中和平共处,因为命名空间不同。
       枚举类型还允许添加任意的方法和域,并实现任意的接口。
       为了将数据与枚举常量关联起来,得声明实例域,并编写一个带有数据并且将数据保存在域中的构造器。
       枚举常量无法通过其构造器访问另一个构造器。
       枚举中的switch语句适合于给外部的枚举类型增加特定于常量的行为。

  使用枚举的场景
每当需要一组固定常量,并且在编译时就知道其成员的时候,就应该使用枚举。

       枚举类型中的常量类型并不一定始终不变。
       如果多个(但非所有)枚举常量同时共享相同的行为,则考虑策略枚举

2.用实例域代替序数

        所有的枚举都有一个ordinal方法,它返回每一个枚举常量在类型中的数字位置。
        永远不要根据枚举的序数导出与它关联的值,而是要将他保存在一个实例域中。

3.用EnumSet代替位域

       如果一个枚举类型的元素主要用在集合中,一般使用int枚举类型。
       Text.applyStyles(STYLE_BOLD | STYLE_ITALIC)
       这种表示法让你用OR位运算将几个常量合并到一个集合中,称为位域
       位域表示法也允许利用位操作,有效的执行像union(联合)和intersection(交集)这样的集合运算。缺点很多。
       Java.uitl包提供了EnumSet类来有效的表示从单个枚举类型中提取的多个值的多个集合。
       每个EnumSet内容都表示为位矢量。

4.用EnumMap代替序数索引

       Map plantsByLifeCycle = new EnumMap<>(Plant.LifeCycle.class)
       EnumMap构造器采用键类型的Class对象,这是一个有限制的类型令牌,提供了运行时的泛型信息。
       最好不要用序数来索引数组,而要使用EnumMap

你可能感兴趣的:(java8)