1、int 枚举模式

在类型安全性和使用方便性没有任何帮助

apple_ 和orange_ 之间比较,编译器不会有任何警告报出

十分脆弱,编译枚举时常量,编译到使用他们的客户端(int关联发生变化需要重新编译)

JAVA interface 转换为子类_Java web 传参int enum

2、String 枚举模式

int 枚举模式变体

常量可打印(int 枚举模式打印出来就是数字),打印出来是字符串

会引来性能问题,因为依赖字符串比较

会使字符串硬编码到客户端代码中(初级编码会这样,而不是使用适当域(field)名)

如果字符串有错误,运行时才会发现,编译时不会有任何警告

3、jdk 1.5以后的新枚举

这种模式本质上是int 值

基本思想:通过公有静态 final 类为每个枚举实例导出常量

没有可以访问的构造器,枚举是真正的final 类

枚举实例是受控的,客户端不能生成枚举实例,不能扩展,只有声明过的枚举常量

JAVA interface 转换为子类_客户端_02

4、枚举提供了编译时的类型安全

传递错误类型会导致编译时报错

试图 == 比较时,各个常量是严格区分的

可以增加或者重新编排枚举类型代码,无需修改客户端代码(因为常量值没有被编译到客户端代码中,存在int 模式中)

5、枚举类型允许添加任意方法和域,实现任意接口

提供了所有Object 方法的高级实现,实现了Comparable 接口和 Serializable 接口

并针对枚举类型的可任意改变性,设计了序列化方式

6、方法或域添加到枚举类型中

将数据和常量关联起来(枚举常量的属性值)

可以使用适当的方法增强枚举类型(枚举类型先成为一个简单集合,慢慢演变成全功能的抽象)

如下,星球枚举类型,传入质量和半径创建常量

将数据与枚举常量关联起来,声明实例域,编写带有数据,并将数据保存在域中的构造器

枚举天生不可变,所有域都应该是final

JAVA interface 转换为子类_客户端_03

7、不同行为与每个枚举常量关联起来,可以使用如下抽象方法

注意不带参数的几个常量写法

JAVA interface 转换为子类_Java web 传参int enum_04

带参数的

JAVA interface 转换为子类_Java web 传参int enum_05

客户端调用

JAVA interface 转换为子类_枚举类型_06

8、枚举类型有一个自动产生的方法

valueOf 方法,将常量的名字转变为常量本身

如果在枚举类型中覆盖toString 方法,要考虑编写一个fromString 方法(实现字符串变回相应枚举)

JAVA interface 转换为子类_Java web 传参int enum_07

枚举构造器不可以访问枚举的静态域,编译时常量除外(枚举不允许在其构造函数中使用静态引用)

枚举类型语法要求:仅仅私有构造方法是允许的(如下)

JAVA interface 转换为子类_客户端_08

9、枚举常量中共享代码更加困难

私有嵌套枚举:策略枚举

JAVA interface 转换为子类_Java web 传参int enum_09

10、枚举中的switch 语句,适合给外部的枚举类型,增加特定于常量的行为

JAVA interface 转换为子类_客户端_10

11、枚举性能缺陷

装载和初始化时会有空间和时间成本

枚举优先使用 Comparable 而非 int常量

12、每当需要固定常量数组的时候,使用枚举

与int 相比,枚举易读、安全、功能强大

特定于常量的方法,优先启用自有值枚举

多个枚举常量共享相同的行为,考虑策略枚举