英文出自 http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

枚举类型,它是字段包含固定数量的常量的类型。常见的例子,罗盘的方向包括东西南北,还有星期的天。

因为他们是常量,所有枚举类型的字段的名字一般是大写字母。

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声明,定义了类(称为enum类型)。枚举类体,可以包含方法和其他字段。编译器为enum自动添加特殊的方法。例如,有一个静态的values方法,返回一个按照声明顺序排列的enum值数组。这个方法通常结合for-each结构,遍历enum类型的所有值。例如,下面Planet类里的代码,演示了遍历银河系的所有行星。

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

注意:所有enum类隐式继承java.lang.Enum。由于java不支持多继承,所有enum也不能继承其他类。

下面的例子中,Planet是一个枚举类型,代表银河系里的所有行星。他们是恒定的质量和半径属性定义。

每个枚举常量都有质量和半径参数的声明。这些值,通过构造方法,在常量初始化时传递进来。java要求常量首先定义,其次才是字段和方法。所以,在字段和方法之前,enum常量列表必须以分号(;)结束。

注意:enum类型的构造方法必须是包内私有或者是private访问。它自动创建在enum体内的开始创建声明的常量,不允许直接调用enum的构造方法。

对于它的属性和构造方法,行星上有方法,使您可以检索你在每个行星的表面引力和重量。下面是一个示例程序,根据你在地球的体重(任何单位),计算,并打印你在所有的行星的体重(在同一个单位):

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));
    }
}

如果在命令行运行Planet.class,参数是175,输出是:

$ 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