6.9.2 枚举类入门

6.9.2 枚举类入门

Java5新增了一个enum关键字(它与classinterface关键字的地位相同),用以定义枚举类。
枚举类是一种特殊的,它一样可以有自己的成员变量方法,可以实现一个或者多个接口,也可以定义自己的构造器
一个Java源文件中最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同。

枚举类与普通类的区别

  • 使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object,因此枚举类不能显式继承其他父类。枚举类可以实现一个或多个接口,其中java.lang.Enum类实现了java.lang.Serializablejava.lang.Comparable两个接口。
  • 使用enum定义非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类
  • 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。
  • 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无须程序员显式添加。

定义枚举类

定义枚举类时,需要:

  • 显式列出所有的枚举值,
  • 所有的枚举值之间以英文逗号(,)隔开,
  • 枚举值列举结束后以英文分号作为结束。
1
2
3
4
5
public enum SeasonEnum
{
//在第一行列出4个枚举实例
SPRING,SUMMER,FALL,WINTER;
}

如上面的SPRING,SUMMER,FALL,WINTER;所示,。这些枚举值代表了该枚举类的所有可能的实例。

使用枚举类的实例

如果需要使用该枚举类的某个实例,则可使用EnumClass.variable的形式,如SeasonEnum.SPRING

遍历枚举类

通过枚举类的values方法可以得到枚举类的所有实例数组,然后可以通过循环迭代输出了枚举类的所有实例。

1
2
3
4
public enum SeasonEnum {
// 在第一行列出4个枚举实例
SPRING, SUMMER, FALL, WINTER;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class EnumTest {
public void judge(SeasonEnum s) {
// switch语句里的表达式可以是枚举值
switch (s) {
case SPRING:
System.out.println("春暖花开,正好踏青");
break;
case SUMMER:
System.out.println("夏日炎炎,适合游泳");
break;
case FALL:
System.out.println("秋高气爽,进补及时");
break;
case WINTER:
System.out.println("冬日雪飘,围炉赏雪");
break;
}
}

public static void main(String[] args) {
// 返回枚举类的所有实例数组
SeasonEnum[] seasonEnums = SeasonEnum.values();
// 遍历所有的枚举类实例
for (int i = 0; i < seasonEnums.length; i++) {
System.out.println(seasonEnums[i]);
}
System.out.println("------------------------------");
// 枚举类默认有一个values方法,返回该枚举类的所有实例
for (SeasonEnum s : SeasonEnum.values()) {
System.out.println(s);
}
// 使用枚举实例时,可通过EnumClass.variable形式来访问
new EnumTest().judge(SeasonEnum.SPRING);
}
}

JDK1.5之后switch的控制表达式可以用是枚举

  • JDK1.5switch的控制表达式可以是任何枚举类型。
  • switch控制表达式使用枚举类型时,后面case表达式中的值可以直接使用枚举值的名字,无须添加枚举类作为限定。

java.lang.Enum类方法

前面已经介绍过,所有的枚举类都继承了java.lang.Enum类,所以枚举类可以直接使用java.lang.Enum类中所包含的方法。 java.lang Enum类中提供了如下几个方法。

方法 描述
int compareTo(E o) 该方法用于与指定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例进行比较。如果该枚举对象定义在指定枚举对象之后,则返回正整数;如果该枚举对象定义在指定枚举对象之前,则返回负整数,否则返回零。
String name() 返回此枚举实例的名称,这个名称就是定义枚举类时列出的所有枚举值之一。与此方法相比,大多数程序员应该优先考虑使用toString方法,因为toString方法返回更加用户友好的名称。
String toString 返回枚举常量的名称,与name方法相似,但toString()方法更常用。
int ordinal() 返回枚举值在枚举类中的索引值(也就是枚举值在枚举声明中的位置,第一个枚举值的索引值为零)。
public static<T extends Enum<T>> T valueOf( Class<T> enumType, String name) 这是一个静态方法,用于返回指定枚举类中指定名称的枚举值。名称必须与在该枚举类中声明枚举值时所用的标识符完全匹配,不允许使用额外的空白字符。