5.6 枚举类
您在第3章中看到了如何定义枚举类型。下面是一个典型的例子:
public enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE }
此声明定义的类型实际上是一个类。类正好有四个实例,无法构造新对象。
因此,对于枚举类型的值,不需要使用equals。只需使用==进行比较。
如果愿意,可以向枚举类型添加构造函数、方法和字段。当然,只有在构造枚举常量时才调用构造函数。下面是一个例子:
public enum Size
{
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");
private String abbreviation;
private Size(String abbreviation) { this.abbreviation = abbreviation }
public String getAbbreviation() { return abbreviation; }
}
枚举的构造函数始终是私有的。可以省略私有修饰符,如前面的示例所示。将枚举构造函数声明为public或protected是一个语法错误。
所有枚举类型都是Enum类的子类。它们从该类继承了许多方法。最有用的是toString,它返回枚举常量的名称。例如,Size.SMALL.toString()返回字符串“SMALL”。
和toString相反是静态valueOf方法。例如,语句
Size s = Enum.valueOf(Size.class, "SMALL");
设置s为Size.SMALL。
每个枚举类型都有一个静态values方法,该方法返回枚举的所有值的数组。例如,调用
Size[] values = Size.values();
返回元素Size.SMALL、Size.MEDIUM、Size.LARGE和Size.EXTRA_LARGE的数组。
ordinal方法在enum声明中生成从零开始计数的枚举常量的位置。例如,Size.MEDIUM.ordinal()返回1。
清单5.12中的简短程序演示了如何使用枚举类型。
注意
Enum类有一个类型参数,为了简单起见,我们忽略了它。例如,枚举类型Size实际上扩展了
Enum<Size>
。类型参数用于compareTo方法。(我们将在第6章中讨论compareTo方法,在第8章中讨论类型参数。)
清单5.12 enums/EnumTest.java
package enums;
import java.util.*;
/**
* This program demonstrates enumerated types.
* @version 1.0 2004-05-24
* @author Cay Horstmann
*/
public class EnumTest
{
public static void main(String[] args)
{
var in = new Scanner(System.in);
System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) ");
String input = in.next().toUpperCase();
Size size = Enum.valueOf(Size.class, input);
System.out.println("size=" + size);
System.out.println("abbreviation=" + size.getAbbreviation());
if (size == Size.EXTRA_LARGE)
System.out.println("Good job--you paid attention to the _.");
}
}
enum Size
{
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");
private Size(String abbreviation) { this.abbreviation = abbreviation; }
public String getAbbreviation() { return abbreviation; }
private String abbreviation;
}
java.lang.Enum<E> 5
- static Enum valueOf(Class enumClass, String name)
返回具有给定名称的给定类的枚举常量。 - String toString()
返回此枚举常量的名称。 - int ordinal()
返回enum声明中此枚举常量的从零开始的位置。 - int compareTo(E other)
如果此枚举常量位于other之前,则返回负整数;如果this==other,则返回零;否则返回正整数。常量的顺序由enum声明给出。