枚举的定义:
  • 枚举是一个特殊的类,一般表示一组常量。

  • Java枚举一般用enum关键字来定义,各个常量使用逗号,来分割。

  • java枚举类型的基本写法:让类通过共有的静态final域为每个枚举常量导出一个实例,枚举类型没有可以访问的构造器,所以它是真的final类。客户端不能创建枚举类型的实例,也不能对它进行扩展,因此不存实例,而只存在声明过程的枚举常量。也就是枚举类型是实例受控的。它们是单例(Singleton)的范型化,本质上是单元素的枚举。

  • 枚举类型保证了编译时的类型安全。包含同名常量的多个枚举类型可以在一个系统中和平共处。因为每个类型都有自己的命名空间。可以新增或者重新排列枚举类型中的常量,而无需重新编译它的客户端代码。

  • 枚举类型可以添加任意的方法和域,并实现任意的接口。它们提供了所有的Object方法的高级实现,实现了Comparable和Serializable接口,并针对枚举类型的可任意改变性提供了序列化方法。

  • 枚举代码实例:

public enum Day {
    SUNDAY("星期日"),
    MONDAY("星期一"),
    TUESDAY("星期二"),
    WEDNESDAY("星期三"),
    THURSDAY("星期四"),
    FRIDAY("星期五"),
    SATURDAY("星期六");

    private final String description;

    Day(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}
声明枚举:

声明枚举时必须使用 enum 关键字,然后定义枚举的名称、可访问性、基础类型和成员等。枚举声明的语法如下:

enum-modifiers enum enumname:enum-base {
    enum-body,
}

[!NOTE]

任意两个枚举成员不能具有相同的名称,且它的常数值必须在该枚举的基础类型的范围之内,多个枚举成员之间使用逗号分隔。

Enum类的常用方法
方法名称 描述
values() 以数组形式返回枚举类型的所有成员
valueOf() 将普通字符串转换为枚举实例
compareTo() 比较两个枚举成员在定义时的顺序
ordinal() 获取枚举成员的索引位置
EnumMap 与 EnumSet
  • EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其他的 Map(如 HashMap)实现也能完成枚举类型实例到值的映射,但是使用 EnumMap 会更加高效。

  • EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。EnumSet 提供了许多工厂方法以便于初始化,

  • EnumMap代码实例:

    // 定义数据库类型枚举
    public enum DataBaseType {
        MYSQUORACLE,DB2,SQLSERVER
    }
    // 某类中定义的获取数据库URL的方法以及EnumMap的声明
    private EnumMap<DataBaseType,String>urls = new EnumMap<DataBaseType,String>(DataBaseType.class);
    public DataBaseInfo() {
        urls.put(DataBaseType.DB2,"jdbc:db2://localhost:5000/sample");
        urls.put(DataBaseType.MYSQL,"jdbc:mysql://localhost/mydb");
        urls.put(DataBaseType.ORACLE,"jdbc:oracle:thin:@localhost:1521:sample");
        urls.put(DataBaseType.SQLSERVER,"jdbc:microsoft:sqlserver://sql:1433;Database=mydb");
    }
    //根据不同的数据库类型,返回对应的URL
    // @param type DataBaseType 枚举类新实例
    // @return
    public String getURL(DataBaseType type) {
        return this.urls.get(type);
    }
    
  • EnumSet 作为 Set 接口实现,它支持对包含的枚举常量的遍历:

    for(Operation op:EnumSet.range(Operation.PLUS,Operation.MULTIPLY)) {
        doSomeThing(op);
    }
    
枚举的使用场景:
  • 作为普通的常量使用,如星期、季节、颜色、城市等等;通常配合switch语句使用。

  • 往枚举中添加变量、构造函数、以达到灵活获取指定值的目的(注: Java 要求必须先定义 enum 实例,否则编译会报错);通常用于一些业务系统中定义一些固定值,如用于匹配db中的字段值等。

  • 往枚举中添加自己特定方法,以实现自己所需的相关业务逻辑。