什么是枚举类?让我们来看看Oracle的java指南的解释。
An enum type is a special data type that enables for a variable to be a set of predefined constants. The variable must be equal to one of the values that have been predefined for it. Common examples include compass directions (values of NORTH, SOUTH, EAST, and WEST) and the days of the week.
枚举类型是一种特殊的数据类型,它允许变量是一组预定义常量。变量必须等于为其预定义的值之一。常见的例子包括指南针方向(北、南、东、西的值)和星期几。
再结合一个例子
public enum Weekday {
SUN(0),
MON(1),
TUS(2),
WED(3),
THU(4),
FRI(5),
SAT(6);
private Integer value;
Weekday(Integer value) {
this.value = value;
}
public Integer getValue() {
return value;
}
public static Weekday getEnums(int value) {
switch (value) {
case 0:
return SUN;
case 1:
return MON;
case 2:
return TUS;
case 3:
return WED;
case 4:
return TUS;
case 5:
return FRI;
case 6:
return SAT;
default:
return null;
}
}
}
这个例子就是一个简单的枚举类型。通过它,我们可以轻易的获得星期几和他对应的数值。
for (Weekday w : Weekday.values()) {
System.out.println("Value:"+ w.getValue());
System.out.println("name:"+ Weekday.getEnums(w.getValue()));
}
//输出结果
Value:0
name:SUN
Value:1
name:MON
Value:2
name:TUS
Value:3
name:WED
Value:4
name:TUS
Value:5
name:FRI
Value:6
name:SAT
为什么不用静态常量来替代枚举类呢?
枚举类更加直观,类型安全。使用常量会有以下几个缺陷:
1. 类型不安全。若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象。
2. 没有命名空间。开发者要在命名的时候以SEASON_开头,这样另外一个开发者再看这段代码的时候,才知道这四个常量分别代表季节。