枚举类型定义了两件事:
以下代码声明了一个名为Level
的公共枚举类型,它具有四个枚举常量:LOW
,MEDIUM
,HIGH
和 URGENT
。
public enum Level { LOW, MEDIUM, HIGH, URGENT; }
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
。第一个枚举常量赋值为0
,第二个为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 + ")"); } } }
上面的代码生成以下结果。
LOW(0) MEDIUM(1) HIGH(2) URGENT(3)
可以从名称或位置获得枚举常量的引用。使用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); } }
执行上面的示例代码,得到如下结果 -
LOW LOW true
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 + " "); } } }
执行上面的示例代码,得到如下结果 -
LOW MEDIUM HIGH URGENT LOW MEDIUM HIGH URGENT