枚举(enum)是指一个经过排序的、被打包成一个单一实体的项列表,
在枚举出现之前,如果想要表示一组特定的离散值,往往使用一些常量。
是JDK1.5版本新增的特性,到了JDK1.6后switch语句支持枚举类型。
Java 中的枚举是一种特殊的数据类型,因为它既是一种类(class)类型却又比类类型多了些特殊的约束。
这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性
枚举类型都隐式继承了java.lang.Enum类,因此不能继承其他类,但可以实现接口。
枚举类型只能有私有的构造方法(java运行时创建,外部不能进行实例化)。
不能泛型化。
当有字段和方法时,枚举常量的列表必须以分号结尾。
编译器在创建枚举时会自动添加一些特殊方法。
对于序列化和反序列化
因为每一个枚举类型和枚举变量在JVM中都是唯一的,即Java在序列化和反序列化枚举时做了特殊的规定。
枚举的writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法是被编译器禁用的。
由int实现的枚举很难保证安全性,即当调用不在枚举范围内的数值时,需要额外的维护,也不利于查看log和测试。
枚举类型提供很多方法可以方便的操作,例如迭代查找等,同时枚举还有较高的运行的效率。
当你使用常量类时,往往得通过equals去判断两者是否相等,
使用枚举的话由于常量值地址唯一,可以用==直接对比,性能会有提高。
编译
常量类编译时,是直接把常量的值编译到类的二进制代码里,
常量的值在升级中变化后,需要重新编译引用常量的类,因为里面存的是旧值。
枚举类编译时,没有把常量值编译到代码里,即使常量的值发生变化,也不会影响引用常量的类。