Java - 枚举类型

283 阅读3分钟

枚举类型

枚举类型是一个特殊的数据类型,能够使一系列变量构造成一个预定义的常量序列。枚举类型的例子:指南针的方向,一周的天数。

由于枚举类型中的值是预先定义的常量,所以枚举类型中的字段都是用大写字母来表示。

Java的枚举类型比其他编程语言的枚举类型更加强大,enum实际上是声明了一个类,称为枚举类型。被声明的枚举类型可以像其他类一样声明属性和方法,当枚举类型被创建时,编译器自动为其添加一些特殊的方法。例如有一个静态值方法,该方法返回一个数组,该数组包含按照声明顺序排列的枚举的所有值。

枚举类型隐式地继承了java.lang.Enum类,在Java世界中,类只能继承一个父类,所以enum声明的枚举类型不能再继承其他的类。

enum是声明枚举类型的关键字。

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

在编写应用程序遇到一系列组合的常量时,可以考虑使用枚举类型。下面的是如何使用枚举类型的伪代码示例:

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

在下面的示例中,Planet 是一个枚举类型,代表太阳系中的行星。 它们使用恒定的质量和半径属性定义。
每个枚举常量都用质量和半径参数的值声明。 这些值在创建常量时传递给构造函数。 Java 要求先定义常量,然后再定义任何字段或方法。 此外,当有字段和方法时,枚举常量列表必须以分号结尾。

注意:枚举类型的构造函数必须是Package-private或私有访问。 它会自动创建 在枚举主体开头时定义的 常量。 您不能自己调用枚举构造函数。

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

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