一.什么是枚举以及枚举的作用(用一个普通类来模拟枚举的作用)
首先先看一段代码,如下所示:
package cn.itcast.enumTest;
public class enumTest {
/**
* 用普通的java类来模拟实现枚举功能
* @param args
*/
public static void main(String[] args) {
WeekDay1 weekDay = WeekDay1.MON;
System.out.println(weekDay.nextDay());
}
}
package cn.itcast.enumTest;
public abstract class WeekDay1 {
private WeekDay1(){}
public abstract WeekDay1 nextDay();
public final static WeekDay1 MON = new WeekDay1(){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
public final static WeekDay1 SUN = new WeekDay1(){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public String toString(){
return this==MON?"MON":"SUN";
}
}
分析一下上述的代码,该程序中定义了一个类WeekDay1,在该类中,把构造方法私有了,也就是不能new该对象,另外,该类中含有一个抽象方法,nextDay,返回值是该类本身,在类的内部,建立了两个子类对象,MON和SUN,这两个对象必须覆盖抽象方法nextDay(),最后,为了能够打印出对象名,覆盖了toString()方法,这就是用一个普通类去模拟实现枚举的功能,里面涉及的主要知识有抽象类,抽象方法,内部类等。
从上面的分析中,我们可以看到,枚举可以在内部限定我们的书写,枚举提供了几个静态常量,我们按照枚举提供的常量就可以避免写错。另外,我们在书写上面的代码时,利用了很多知识,很麻烦,为了加快软件开发效率,减少程序员的工作量,java对上述代码进行了封装,得到了枚举类,那么,枚举中都有哪些方法呢,我们通过一段程序进行学习:
package cn.itcast.enumTest;
public class enumMethod {
/**
* @param args
*/
public static void main(String[] args) {
WeekDay weekDay = WeekDay.FRI;
System.out.println(weekDay);
System.out.println(weekDay.ordinal());
System.out.println(WeekDay.valueOf("FRI"));
System.out.println(WeekDay.values().length);
}
}
package cn.itcast.enumTest;
public enum WeekDay {
SUN(1),MON,TUES,WEDN,THUR,FRI(1),SAT;
private WeekDay(){System.out.println("first");}
private WeekDay(int day){System.out.println("second");}
}
执行上述代码,编译运行后的结果如下所示:
FRI
5
FRI
7
5
FRI
7
由此可见,enum类中定义了许多操作枚举的方法,这使得我们使用时更加方便,快捷。
二.枚举综合应用
根据枚举中的作用,我们做了交通灯这个案例,对我们深入理解枚举有重要的作用,下面是交通灯的代码:
package cn.itcast.enumTest;
public class enumMethod {
/**
* @param args
*/
public static void main(String[] args) {
WeekDay weekDay = WeekDay.FRI;
System.out.println(weekDay);
System.out.println(weekDay.ordinal());
System.out.println(WeekDay.valueOf("FRI"));
System.out.println(WeekDay.values().length);
}
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp() {
return GREEN;
}
},
YELLOW(5){
public TrafficLamp nextLamp() {
return RED;
}
},
GREEN(30){
public TrafficLamp nextLamp() {
return YELLOW;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time=time;}
}
}