enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。enum使用也比较广泛,下面就说一下使用枚举过程需要注意的问题。
1 枚举的创建
枚举使用enum关键字,还是先来看一段代码吧
public enum WeekDay {
SUN, MON, TUE, WED, THU, FN("星期五"), SAT();
private WeekDay() {
System.out.println("没有参数构造函数");
}
private WeekDay(String s) {
System.out.println(s + "有参数构造函数");
}
}
实例代码中创建了一个WeekDay的枚举,如果在主main方法里面执行语句:WeekDay today = WeekDay.SAT;其实这段代码实际上调用了7次 Enum(String name, int ordinal):输出为:
没有参数构造函数
没有参数构造函数
没有参数构造函数
没有参数构造函数
没有参数构造函数
星期五有参数构造函数
没有参数构造函数
2 枚举遍历
枚举通常需要遍历,常见的是联合switch—canse语句实现一些遍历功能。看下面的代码:
public enum EnumTest {
MON, TUE, WED, THU, FRI, SAT, SUN;
}
public class Test {
public static void main(String[] args) {
for (EnumTest e : EnumTest.values()) {
System.out.println(e.toString());
}
EnumTest test = EnumTest.TUE;
switch (test) {
case MON:
System.out.println("今天是星期一");
break;
case TUE:
System.out.println("今天是星期二");
break;
default:
System.out.println(test);
break;
}
}
}
不难分析,上面的输出是MON
TUE
WED
THU
FRI
SAT
SUN
今天是星期二
for (EnumTest e : EnumTest.values())是将强版的for循环语句,使用规则是: for (循环变量类型 循环变量名称 : 要被遍历的对象) { 循环体}
3 枚举类型与抽象的综合使用
public class EnumConsAbstract {
public static void main(String[] args) {
WeekDay today = WeekDay.SAT;
System.out.println("SAT的下一天为"+today.nextDay());
}
public enum WeekDay {
SUN {
public WeekDay nextDay() {
return MON;
}
},
MON {
public WeekDay nextDay() {
return TUE;
}
},
TUE {
public WeekDay nextDay() {
return WED;
}
},
WED {
public WeekDay nextDay() {
return THU;
}
},
THU {
public WeekDay nextDay() {
return FN;
}
},
FN {
public WeekDay nextDay() {
return SAT;
}
},
SAT {
public WeekDay nextDay() {
return SUN;
}
};
public abstract WeekDay nextDay();
}
}
枚举里面创建了一个抽象方法,返回类型是枚举类型,用来测试当天时间的下一天是周几。枚举内容包括一周内的七天,对每一个元素都重写了抽象方法,返回不同的枚举值。输出结果是:SAT的下一天为SUN。
4 使用构造函数创建枚举对象
public class WeekDay {
private WeekDay(){
}
public final static WeekDay SUN = new WeekDay();
public final static WeekDay MON = new WeekDay();
public final static WeekDay TUE = new WeekDay();
public final static WeekDay WED = new WeekDay();
public final static WeekDay THU = new WeekDay();
public final static WeekDay FN = new WeekDay();
public final static WeekDay SAT = new WeekDay();
public WeekDay nextDay() {
if (this == SUN) {
return MON;
} else if (this == MON) {
return TUE;
} else if (this == TUE) {
return WED;
} else if (this == WED) {
return THU;
} else if (this == THU) {
return FN;
} else if (this == FN) {
return SAT;
} else {
return SUN;
}
}
public String toString(){
if (this == SUN) {
return "星期日";
} else if (this == MON) {
return "星期一";
} else if (this == TUE) {
return "星期二";
} else if (this == WED) {
return "星期三";
} else if (this == THU) {
return "星期四";
} else if (this == FN) {
return "星期五";
} else {
return "星期六";
}
}
}
使用构造函数创建信息的七个对象,这样也能到达创建枚举元素的目的。最后对nextDay()方法进行设计也能实现直接用枚举设计的功能。