Enum Types

枚举类型是一种特殊的数据类型,它使变量成为一组 预定义的常量。该变量必须等于为其 预定义的值之一。常见示例包括指南针方向(北,南,东和西的值)和星期几。

因为它们是常量,所以枚举类型的字段名称使用大写字母。

在 Java 编程语言中,您可以使用enum关键字定义枚举类型。例如,您可以将星期几枚举类型指定为:

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY 
}

每当需要表示一组固定的常量时,都应使用枚举类型。其中包括自然的枚举类型,例如我们太阳系中的行星和数据集,在编译时您知道所有可能的值,例如,菜单上的选项,命令行标志等。

这是一些代码,向您展示如何使用上面定义的Day枚举:

public class EnumTest {
    Day day;
    
    public EnumTest(Day day) {
        this.day = day;
    }
    
    public void tellItLikeItIs() {
        switch (day) {
            case MONDAY:
                System.out.println("Mondays are bad.");
                break;
                    
            case FRIDAY:
                System.out.println("Fridays are better.");
                break;
                         
            case SATURDAY: case SUNDAY:
                System.out.println("Weekends are best.");
                break;
                        
            default:
                System.out.println("Midweek days are so-so.");
                break;
        }
    }
    
    public static void main(String[] args) {
        EnumTest firstDay = new EnumTest(Day.MONDAY);
        firstDay.tellItLikeItIs();
        EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
        thirdDay.tellItLikeItIs();
        EnumTest fifthDay = new EnumTest(Day.FRIDAY);
        fifthDay.tellItLikeItIs();
        EnumTest sixthDay = new EnumTest(Day.SATURDAY);
        sixthDay.tellItLikeItIs();
        EnumTest seventhDay = new EnumTest(Day.SUNDAY);
        seventhDay.tellItLikeItIs();
    }
}

输出为:

Mondays are bad.
Midweek days are so-so.
Fridays are better.
Weekends are best.
Weekends are best.

Java 编程语言的枚举类型比其他语言的枚举类型更强大。 enum声明定义一个类(称为枚举类型)。枚举类主体可以包括方法和其他字段。编译器在创建枚举时会自动添加一些特殊方法。例如,它们有一个静态的values方法,该方法以声明 Sequences 返回包含枚举的所有值的数组。此方法通常与 for-each 构造结合使用以迭代枚举类型的值。例如,下面的Planet类示例中的此代码遍历太阳系中的所有行星。

for (Planet p : Planet.values()) {
    System.out.printf("Your weight on %s is %f%n",
                      p, p.surfaceWeight(mass));
}

Note:

所有枚举都隐式扩展java.lang.Enum。因为一个类只能扩展一个父级(请参见Declaring Classes),所以 Java 语言不支持状态的多重继承(请参见状态,实现和类型的多重继承),因此枚举不能扩展任何其他内容。

在以下示例中,Planet是一种枚举类型,表示太阳系中的行星。它们具有恒定的质量和半径属性。

每个枚举常量都用质量和半径参数的值声明。创建常量时,这些值将传递给构造函数。 Java 要求先定义常量,然后再定义任何字段或方法。同样,当存在字段和方法时,枚举常量列表必须以分号结尾。

Note:

枚举类型的构造函数必须是程序包私有或私有访问。它会自动创建在枚举主体开头定义的常量。您不能自己调用枚举构造函数。

Planet除了其属性和构造函数外,其方法还允许您检索每个行星上object的表面重力和重量。这是一个示例程序,该程序将您在地球上的重量(以任何单位为单位)并计算并打印在所有行星上的重量(以同一单位):

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    private double mass() { return mass; }
    private double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage: java Planet <earth_weight>");
            System.exit(-1);
        }
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }
}

如果您在命令行中使用参数 175 运行Planet.class,则会得到以下输出:

$ java Planet 175
Your weight on MERCURY is 66.107583
Your weight on VENUS is 158.374842
Your weight on EARTH is 175.000000
Your weight on MARS is 66.279007
Your weight on JUPITER is 442.847567
Your weight on SATURN is 186.552719
Your weight on URANUS is 158.397260
Your weight on NEPTUNE is 199.207413