Java 枚举值

Java面向对象设计 - Java枚举值


枚举类型定义了两件事:

  • 枚举常量
  • 这些常量的顺序

以下代码声明了一个名为Level的公共枚举类型,它具有四个枚举常量:LOW,MEDIUM,HIGH和URGENT。

public enum Level {
    LOW,  MEDIUM,  HIGH, URGENT;
}

Level枚举类型定义了四个枚举常量。

Level枚举类型的变量只能有四个值之一 - LOW,MEDIUM,HIGH和URGENT或null。

我们可以使用点符号通过使用枚举类型名称作为限定符来引用枚举常量。

以下代码将值分配给Level枚举类型的变量:

Level low  = Level.LOW; 
Level medium = Level.MEDIUM; 
Level high  = Level.HIGH; 
Level urgent = Level.URGENT;

我们不能实例化枚举类型。以下代码导致编译时错误:

Level badAttempt   = new Level(); // A  compile-time error

枚举分配顺序号

枚举类型为其所有常量分配一个顺序号,称为ordinal。

序数从零开始,在常数列表中从第一个到最后一个递增1。

第一个枚举常量赋值为零,第二个为1,第三个为2,依此类推。

分配给Level枚举类型中声明的常量的序数值为0到LOW,1到MEDIUM,2到HIGH,以及3到URGENT。

每个枚举常量都有一个与常量的标识符相同的名称。例如,级别枚举类型中的LOW常数的名称为“LOW”。

我们可以分别使用name()和ordinal()方法获取枚举常量的名称和序号。

每个枚举类型都有一个名为values()的静态方法,它按它们在正文中声明的顺序返回一个常量数组。

以下代码打印在Level枚举类型中声明的所有枚举常量的名称和序号。

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    for (Level s : Level.values()) {
      String name = s.name();
      int ordinal = s.ordinal();
      System.out.println(name + "(" + ordinal + ")");
    }
  }
}

上面的代码生成以下结果。

枚举常量的反向查找

我们可以从名称或位置获得枚举常量的引用。使用valueOf()方法。

枚举常量的反向查找区分大小写。

我们可以使用values()方法返回的数组,通过顺序执行反向查找。

values()方法返回的数组中的值的顺序与枚举常量的声明顺序相同。

枚举常量的序数从零开始。

以下代码演示了如何反转查找枚举常量:

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    Level low1 = Level.valueOf("LOW");
    // A reverse lookup using a name
    Level low2 = Level.values()[0];
    // A reverse lookup using an ordinal
    System.out.println(low1);
    System.out.println(low2);
    System.out.println(low1 == low2);

  }
}

上面的代码生成以下结果。

枚举常量的范围

java.util.EnumSet集合类与枚举类型的枚举常量列表一起使用。

下面的代码演示了如何使用EnumSet类来处理枚举常量的范围。

import java.util.EnumSet;

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    EnumSet<Level> allLevels = EnumSet.allOf(Level.class);
    print(allLevels);

    EnumSet<Level> l = EnumSet.range(Level.LOW, Level.URGENT);
    print(l);

  }
  public static void print(EnumSet<Level> levels) {
    for (Level d : levels) {
      System.out.println(d + "  ");
    }
  }
}

上面的代码生成以下结果。