java类模拟枚举的实现原理,便于更好的理解枚举
方式一
/**
* java普通类模拟枚举实现原理
*
* @author chinoukin
*
*/
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 FRI = 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 FRI;
} else if (this == FRI) {
return SAT;
} else {
return SUN;
}
}
}
方式二
/**
* java普通类模拟枚举实现原理(二)
*
* @author chinoukin
*
*/
public abstract class WeekDayAbstract {
private WeekDayAbstract() {
}
public final static WeekDayAbstract SUN = new WeekDayAbstract() {
@Override
public WeekDayAbstract nextday() {
return MON;
}
};
public final static WeekDayAbstract MON = new WeekDayAbstract() {
@Override
public WeekDayAbstract nextday() {
return TUE;
}
};
public final static WeekDayAbstract TUE = new WeekDayAbstract() {
@Override
public WeekDayAbstract nextday() {
return WED;
}
};
public final static WeekDayAbstract WED = new WeekDayAbstract() {
@Override
public WeekDayAbstract nextday() {
return THU;
}
};
public final static WeekDayAbstract THU = new WeekDayAbstract() {
@Override
public WeekDayAbstract nextday() {
return FRI;
}
};
public final static WeekDayAbstract FRI = new WeekDayAbstract() {
@Override
public WeekDayAbstract nextday() {
return SAT;
}
};
public final static WeekDayAbstract SAT = new WeekDayAbstract() {
@Override
public WeekDayAbstract nextday() {
return SUN;
}
};
public abstract WeekDayAbstract nextday();
}
通过上面java类的模拟,现在我们来实现一个枚举
/**
* 枚举类,借助java模拟来理解
* @author chinoukin
*
*/
public enum TrafficLamp {
RED(30){
public TrafficLamp nextLamp() {
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp() {
return RED;
}
};
public abstract TrafficLamp nextLamp();
@SuppressWarnings("unused")
private int time;
private TrafficLamp(int time) {
this.time = time;
}
}