Java 枚举
枚举是一种特殊类型的数据使得其能够成为一个变量,值是一组预定义的常量,变量值必须等于为其预定义的值之一。
常见示例包括方向
(NORTH,SOUTH,EAST和WEST的值)和星期几
。
因为它们是常量
,所以枚举类型字段的名称是大写字母
。
1.使用
使用enum关键字定义枚举类型。
例如,可以将星期几的枚举类型指定为:
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
1.1 使用说明
枚举类主体
可以包括方法
和其他字段
。
编译器在创建枚举时会自动添加一些特殊方法
。
例如,它们有一个静态values
方法,它按照声明的顺序返回一个包含枚举值的所有值的数组。
此方法通常与for-each构造结合使用,以迭代枚举类型的值。
例如,Planet
下面的类示例中的代码迭代太阳系中的所有行星。
for (Planet p : Planet.values()) {
System.out.printf("Your weight on %s is %f%n", p, p.surfaceWeight(mass));
}
注意:所有枚举都隐式扩展java.lang.Enum。因为类只能扩展一个父类(请参阅 声明类),
所以Java语言不支持多重继承状态(请参阅 状态,实现和类型的多重继承),因此枚举不能扩展其他任何内容。
在以下示例中,Planet是一个枚举类型,表示太阳系中的行星,它们具有恒定的质量
和半径属性
。
每个枚举常量都声明为质量
和半径
参数的值,创建常量时,这些值将传递给构造函数。
Java要求在任何字段或方法之前首先定义常量,此外,当存在字段和方法时,枚举常量列表
必须以分号结尾
。
注意:枚举类型的构造函数必须是包私有或私有访问。它会自动创建在枚举主体开头定义的常量。您不能自己调用枚举构造函数。
除了它的属性和构造函数之外,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) {
for (Planet p : Planet.values()) {
double mass = p.mass();
double radius = p.radius();
System.out.printf("Your weight on %s is %f%n", p, mass, radius);
}
}
}
结果:
Your weight on MERCURY is 330300000000000000000000.000000
Your weight on VENUS is 4869000000000000000000000.000000
Your weight on EARTH is 5976000000000000000000000.000000
Your weight on MARS is 642100000000000000000000.000000
Your weight on JUPITER is 1900000000000000000000000000.000000
Your weight on SATURN is 568800000000000000000000000.000000
Your weight on URANUS is 86860000000000000000000000.000000
Your weight on NEPTUNE is 102400000000000000000000000.000000
1.2 switch
扩大 switch 语句使用范围
5.0 之前,Java 中 switch 的值只能够是简单类型,比如 int、byte、short、char, 有了枚举类型之后,就可以使用对象了。
// 定义一周七天的枚举类型
public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun }
// 读取当天的信息
WeekDayEnum today = readToday();
// 根据日期来选择进行活动
switch(today) {
Mon: do something; break;
Tue: do something; break;
Wed: do something; break;
Thu: do something; break;
Fri: do something; break;
Sat: play sports game; break;
Sun: have a rest; break;
}
参考:
[ 1 ].https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
[ 2 ].https://www.ibm.com/developerworks/cn/java/j-lo-enum/index.html