1. 枚举定义
通常把枚举理解为一组固定且相关的常量,用一个类型来表示,这样既可以限制它的取值范围,防止出现意外的值,也让 Java 编译器能够进行静态检查,保证类型安全。下面是一个简单的枚举类型定义:
public enum MyEnum {
A, B, C
}
这是 Java 中最简单的枚举定义,看起来和 C# 中的枚举没什么区别,其实区别大了去了。在 C# 中,枚举本质上是整数常量,而在 Java 中,枚举本质上是引用类型,是类!
既然 MyEnum 是一个类,那么 A、B、C 就是它的三个实例,而且是仅有的三个实例,你不能也无法创建出第四个第五个它的实例。
2. 使用枚举
简单的枚举类型,用法也很简单,首先是赋值和打印:
MyEnum e = null;
e = MyEnum.A;
System.out.println(e); // 打印 A
e = MyEnum.B;
System.out.println(e); // 打印 B
e = MyEnum.C;
System.out.println(e); // 打印 C
如果使用静态导入语句(import static MyEnum.*;),就可以直接用 A、B、C,不需要前缀了。
3. 枚举与 switch 语句
一般情况下,引用是不能用于 switch 语句的,但枚举例外:
void printMyEnum(MyEnum e) {
switch (e) {
case A:
System.out.println("It's A");
break;
case B:
System.out.println("It's B");
break;
case C:
System.out.println("It's C");
break;
}
}
有意思的是,在没有使用静态导入语句的情况下,在 case 后面的常量值也不能用 MyEnum. 作前缀,用了反而报编译错误。
4. 枚举类型的方法
4.1 ordinal()
这个方法返回常量值的序号,从 0 开始。A.ordinal() 返回 0,B.ordinal() 返回 1,C.ordinal() 返回 2。
4.2 name()
返回常量的名称。A.name() 返回 "A",B.name() 返回 "B",C.name() 返回 "C"。
4.3 toString()
默认返回 name() 的结果。可以重写,善于枚举的方法重写,以后会另写一篇文章专门讨论,这里就不多讲了。
5. 总结
如果你已经用烦了以前那种定义静态整数常量的写法,而且总是担心这个些常量的值一不小心被哪个粗心的程序员用错了,那么你应该考虑使用枚举来代替。