1、int 枚举模式
- 在类型安全性和使用方便性没有任何帮助
- apple_ 和orange_ 之间比较,编译器不会有任何警告报出
- 十分脆弱,编译枚举时常量,编译到使用他们的客户端(int关联发生变化需要重新编译)
2、String 枚举模式
- int 枚举模式变体
- 常量可打印(int 枚举模式打印出来就是数字),打印出来是字符串
- 会引来性能问题,因为依赖字符串比较
- 会使字符串硬编码到客户端代码中(初级编码会这样,而不是使用适当域(field)名)
- 如果字符串有错误,运行时才会发现,编译时不会有任何警告
3、jdk 1.5以后的新枚举
- 这种模式本质上是int 值
- 基本思想:通过公有静态 final 类为每个枚举实例导出常量
- 没有可以访问的构造器,枚举是真正的final 类
- 枚举实例是受控的,客户端不能生成枚举实例,不能扩展,只有声明过的枚举常量
4、枚举提供了编译时的类型安全
- 传递错误类型会导致编译时报错
- 试图 == 比较时,各个常量是严格区分的
- 可以增加或者重新编排枚举类型代码,无需修改客户端代码(因为常量值没有被编译到客户端代码中,存在int 模式中)
5、枚举类型允许添加任意方法和域,实现任意接口
- 提供了所有Object 方法的高级实现,实现了Comparable 接口和 Serializable 接口
- 并针对枚举类型的可任意改变性,设计了序列化方式
6、方法或域添加到枚举类型中
- 将数据和常量关联起来(枚举常量的属性值)
- 可以使用适当的方法增强枚举类型(枚举类型先成为一个简单集合,慢慢演变成全功能的抽象)
- 如下,星球枚举类型,传入质量和半径创建常量
- 将数据与枚举常量关联起来,声明实例域,编写带有数据,并将数据保存在域中的构造器
- 枚举天生不可变,所有域都应该是final
7、不同行为与每个枚举常量关联起来,可以使用如下抽象方法
- 注意不带参数的几个常量写法
- 带参数的
- 客户端调用
8、枚举类型有一个自动产生的方法
- valueOf 方法,将常量的名字转变为常量本身
- 如果在枚举类型中覆盖toString 方法,要考虑编写一个fromString 方法(实现字符串变回相应枚举)
- 枚举构造器不可以访问枚举的静态域,编译时常量除外(枚举不允许在其构造函数中使用静态引用)
- 枚举类型语法要求:仅仅私有构造方法是允许的(如下)
9、枚举常量中共享代码更加困难
私有嵌套枚举:策略枚举
10、枚举中的switch 语句,适合给外部的枚举类型,增加特定于常量的行为
11、枚举性能缺陷
- 装载和初始化时会有空间和时间成本
- 枚举优先使用 Comparable 而非 int常量
12、每当需要固定常量数组的时候,使用枚举
- 与int 相比,枚举易读、安全、功能强大
- 特定于常量的方法,优先启用自有值枚举
- 多个枚举常量共享相同的行为,考虑策略枚举