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<Plant.lifeCycle, SET> plantsByLifeCycle = new EnumMap<>(Plant.LifeCycle.class)
EnumMap构造器采用键类型的Class对象,这是一个有限制的类型令牌,提供了运行时的泛型信息。
最好不要用序数来索引数组,而要使用EnumMap
标签:java,常量,Effective,int,枚举,EnumMap,类型,序数 来源: https://blog.csdn.net/qq_34787356/article/details/98886644