枚举类型
枚举类型是一个特殊的数据类型,能够使一系列变量构造成一个预定义的常量序列。枚举类型的例子:指南针的方向,一周的天数。
由于枚举类型中的值是预先定义的常量,所以枚举类型中的字段都是用大写字母来表示。
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));
}
}