枚举类型
枚举类型是一种特殊的数据类型,它使得变量成为一组预定义的常量。变量必须等于预定义的值之一。常见的示例有罗盘方向与星期。
由于预定值为常量,所以枚举类型的字段名称为大写字母。
Java中,使用enum关键字定义枚举类型。
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
当需要表示固定常量集时,应当使用枚举类型。这包括自然枚举类型(例如太阳系中行星)与在编译时可知所有可能值的数据集(例如菜单中的选项,命令行标识等)。
编程中使用枚举类型
public class EnumLearn {
Day day;
public EnumLearn(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) {
EnumLearn firstDay = new EnumLearn(Day.MONDAY);
firstDay.tellItLikeItIs();
EnumLearn thirdDay = new EnumLearn(Day.WEDNESDAY);
thirdDay.tellItLikeItIs();
EnumLearn fifthDay = new EnumLearn(Day.FRIDAY);
fifthDay.tellItLikeItIs();
EnumLearn sixthDay = new EnumLearn(Day.SATURDAY);
sixthDay.tellItLikeItIs();
EnumLearn seventhDay = new EnumLearn(Day.SUNDAY);
seventhDay.tellItLikeItIs();
}
}
enum声明定义了一个类(称为枚举类型)。枚举类的正文可以包含方法与其他字段。当创建一个枚举时,编译器会自动添加一些特定的方法。例如,静态方法values返回一个数组,此数组包含枚举中声明的所有成员,并且按序返回。此方法一般与for-each结构一起使用,用于迭代枚举类型中的所有值。
注意:所有的枚举隐式继承java.lang.Enum。因为类只能继承一个双亲,Java语言不支持多重继承,所以枚举不能继承任何类。
java要求枚举类型中,常量要首先声明,先于方法与域。而且,当存在方法与域时,枚举常量列表必需以分号结尾。
注意:枚举类型的构造器必须为包私有或私有。它会自动创建在枚举正文开始位置定义的常量。不能手动调用枚举的构造器。
import java.util.*;
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;
private final double radius;
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
private double mass() { return mass; }
private double radius() { return radius; }
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();
Arrays.asList(Planet.values()).stream().forEach(p -> System.out.printf("%s %s%n", p, p.surfaceWeight(mass)));
}
}