Java编程自学之路:枚举


简介

enum的全称为enumeration,是JDK5引入的新特性;

在Java中,被enum关键字修饰的类型就是枚举类型,形式如下:

enum ColorEm {RED,GREEN,BLUE}
  • 枚举好处:可以将常量组织起来,统一进行管理;
  • 应用场景:错误码、状态机;

枚举解析

枚举定义

java.lang.Enum类声明:

public  abstract class Enum<E extends Enum<E>>  implements Comparable<E>,Serializable {
  
  private final String name;
  
  public final String name() { return name;}
  public final int ordinal() {...};
  public final boolean equals(Object other) { return this == other;};
  public final class<E> getDeclaringClass() {...};
  public final int compareTo() {...};
}

enum中,提供了一些基本方法:

  • name():返回实例名;
  • ordinal():返回实例声明时的次序,从0开始;
  • equals():判断是否为同一个对象;
  • getDeclaringClass():返回实例所属的enum类型;
  • compareTo():对象比较;

enum支持通过==来进行实例比较;

枚举特性

枚举的本质是java.lang.Enum的子类,是一种受限制的类,并且不能别其他类继承;

定义的枚举值,默认会被public static final修饰,本质上是静态常量;

基本特性

如果枚举没有定义方法,也可以在最后一个实例后添加逗号、分号或什么都不加;

如果枚举中没有定义方法,枚举值默认为从0开始的数值;

枚举方法

枚举中可以添加普通方法、静态方法、抽象方法、构造方法;

枚举不支持使用=进行赋值,但可通过定义方法来实现对枚举赋值;

枚举如果定义方法,那么必须在枚举的最后一个实例添加分号作为结尾,否则编译器会报错;

枚举应用

组织常量

在JDK5之前,在Java中定义常量的方式为public static final Type var;有了枚举之后,可以将有关联关系的常量组织起来,使代码更加易读、安全,并且可以使用枚举提供的方法;

switch状态机

Java经常使用switch来编写状态机,在JDK7之后,switch已经支持intcharStringenum类型的参数。这几种类型参数比较起来,使用枚举的switch代码更具有可读性;

枚举工具类

Java提供了两个方便操作的工具类:EnumSetEnumMap

EnumSet

EnumSet是枚举类型的高性能Set实现;它要求放入它的枚举常量必须属于同一枚举类型;

主要方法:

  • noneOf:创建一个具有指定元素类型的空EnumSet

  • allOf:创建一个指定元素类型并包括所有枚举类型的EnumSet

  • range:创建一个包含枚举值中指定范围元素的EnumSet

  • complementOf:初始集合包括指定集合的补集;

  • of:创建一个包括阐述中所有元素的EnumSet

  • copyOf:创建一个包含参数容器中的所有元素的EnumSet

EnumMap

EnumMap是专门为枚举类型量身定做的Map实现,虽然使用其他的Map实现也能完成枚举类型实例到值的映射,但是使用EnumMap会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用属组来存放与枚举类型对应的值,这使得EnumMap效率非常高;

主要方法:

  • size:返回键值对数量;
  • containsValue:判断是否存在指定的value
  • containsKey:判断是否存在指定的key
  • get:根据指定的key获取对应value
  • put:根据指定的key取出value
  • remove:删除指定的键值对;
  • putAll:批量去除所有的键值对;
  • keySet:获取所有key的集合;
  • values:返回所有value

文章作者: Semon
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Semon !
评论
  目录