enum全称enumeration,是JDK5中引入的特性。
枚举简介:
- 定义:被enum关键字修饰的类型就是枚举类型。
- 优点:可以将常量组织起来,统一进行管理。
- 场景:错误码、状态机等。
- 枚举的本质:是java.lang.Enum的子类。尽管enum看起来像是一种新的数据类型,事实上,enum是一种受限制的类,并且具有自己的方法。枚举这种特殊的类因为被修饰为final,所以不能继承其他类。定义的枚举类,会被默认修饰为 public static final,从修饰的关键字,即可以看出枚举值本质上是静态常量。
枚举的方法:
- values():返回enum实例的数组,而且该数组中的元素严格保持在enum中声明时的顺序。
- name():返回实例名。
- ordinal():返回实例声明时的索引值。
- getDeclaringClass():返回实例所属的enum类型。
- equals():判断是否为同一个对象。
枚举的特征:
- 除了不能继承,基本上可以将enum看做一个常规的类。
- 如果枚举中没有定义方法,也可以在最后一个实例后面加逗号、分好或者什么都不加。
- 如果要为enum定义方法,那么必须在enum的最后一个实例尾部添加一个分号。此外,在enum中必须先定义实例,不能将字段或方法定义在实例前面,否则,编译器会报错。
- java不允许使用=为枚举常量赋值。
- enum可以通过方法来显示的赋值。
- 枚举可以添加普通方法、静态方法、抽象方法、构造方法。
- 枚举可以实现接口。
- 枚举不可以继承。因为enum实际上都继承自java.lang.Enum类,而java不支持多重继承,所以enum不能再继承其他类,当然也不能继承另一个enum。
枚举的应用:
- 组织常量
- switch状态机
- 错误码
- 组织枚举
- 策略枚举
- 枚举实现单例模式
枚举工具类:
java中提供了两个方便操作enum的工具类----EnumSet和EnumMap
1、EnumSet是枚举类型的高性能Set实现。它要求放入它的枚举常量必须属于同一枚举类型。
2、EnumMap是专门为枚举类型量身定做的Map实现。虽然使用其他的Map实现(如HashMap)也能完成枚举类型实例到值的映射,但是使用EnumMap会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值。这使得EnumMap的效率非常高。