JDK 5出现的新特性,新增的enum关键字用于定义枚举类。Java中声明的枚举类,均是继承自Enum。
为什么需要枚举?
Java的一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前的程序猿们都采用自定义带有枚举功能的类解决,Java5新特性出现后可以直接使用枚举予以解决。
枚举类具有以下特性:
① 枚举类是一种特殊形式的java类;
② 枚举类中声明的每一个枚举值代表枚举类的一个实例对象;
③ 与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但是构造函数必须是私有的。(为避免还可以使用该方法的构造函数创建其他对象);
④ 枚举类也可以实现接口或者继承抽象类;
⑤ JDK 5 中扩展的switch语句,它除了可以接受int、short、byte、char外,还可以接受一个枚举类型;
⑥ 若枚举类只有一个枚举值,则可以当作单态设计模式(内存始终只有一个该类的对象)使用;
自定义带有枚举功能的类示例代码(例如学生成绩五个等级):
class Grade{
private Grade(){} //Grade方法的构造函数,私有是为了限制数据不能是任意的
public static final Grade A=new Grade();
public static final Grade B=new Grade();
public static final Grade C=new Grade();
public static final Grade D=new Grade();
public static final Grade E=new Grade();
}
一个枚举也可以有构造函数、字段和方法。例如每周都有7天,分别为MON、TUE、 WED、 THU、FRI、SAT、 SUN,我们在使用这种类型的数据时候,也可以使用枚举。示例代码:
enum WeekDay {
A("MON"), B("TUE"), C("WED"), D("THU"), E("FRI"), F("SAT"), G("SUN");
private String value;<span style="white-space:pre"> </span>//封装每个对象对应的字段
private WeekDay(String wd) {
this.value = wd;
}
public String getValue() {
return this.value;
}
}
特别
注意的是:定义枚举类的时候构造函数必须要私有。
带抽象方法的枚举示例代码:
enum WeekDay {
A("MON") {
public String localValue() {
return "周一";
}
},
B("TUE") {
public String localValue() {
return "周二";
}
},
C("WED") {
public String localValue() {
return "周三";
}
},
D("THU") {
public String localValue() {
return "周四";
}
},
E("FRI") {
public String localValue() {
return "周五";
}
},
F("SAT") {
public String localValue() {
return "周六";
}
},
G("SUN") {
public String localValue() {
return "周日";
}
};
private String value;
private WeekDay(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
public abstract String localValue();
}
注意:在定义枚举时,定义了抽象方法时,需要在创建每个枚举对象时候实现该抽象方法;
由于枚举类继承自Enum,所以其继承Enum的所有方法,枚举类中的常用方法有:
name();返回次枚举常量的名称,在其枚举声明中对其进行声明;
ordinal();返回枚举常量的序数(它在枚举声明中的位置,其中初始常量为0);
valueof(class enumClass,String name);返回带指定名称的指定枚举类型的枚举常量;
values();用于遍历枚举的所有枚举值。