用一个例子来说明:
在程序中规定交通灯的取值只能是RED,GREEN,YELLOW取其他值就会报错,并且还能根据当前颜色知道下个颜色.怎么实现??
一. 用普通类来实现
public abstract class TrafficLamp {
public TrafficLamp() {}
//取得下个灯
public abstract TrafficLamp nextLamp();
//内部类实现覆写
public final static TrafficLamp RED = new TrafficLamp(){
@Override
public TrafficLamp nextLamp() {
return GREEN;
}
};
public final static TrafficLamp GREEN = new TrafficLamp(){
@Override
public TrafficLamp nextLamp() {
return YEllOW;
}
};
public final static TrafficLamp YEllOW = new TrafficLamp(){
@Override
public TrafficLamp nextLamp() {
return RED;
}
};
@Override
public String toString() {
if(this == RED){
return "RED";
}else if(this == GREEN){
return "GREEN";
}else{
return "YEllOW";
}
}
}
测试:
public class EnumTest {
public static void main(String[] args) {
TrafficLamp red = TrafficLamp.RED;
System.out.println(red.toString());
System.out.println(red.nextLamp().toString());
}
结果:
RED
GREEN
二、用枚举实现
public class EnumTest {
public static void main(String[] args) {
TrafficLamp red = TrafficLamp.RED;
System.out.println(red.toString());
System.out.println(red.nextLamp().toString());
}
public enum TrafficLamp{
RED{
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN{
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW{
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
}
}
结果:
RED
GREEN
所以:
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
枚举还提供了很多使用的方法。可以查看帮助文档