一、模拟枚举的实现原理之交通灯
1、定义一个抽象的类TrafficLamp.java
public abstract class TrafficLamp {
private TrafficLamp(){};
//定义一个让子类实现去的抽象方法
public abstract TrafficLamp nextLamp();
/*红灯,使用匿名类,消除了if语句**/
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;
}
};
/**为了方便打印,重写toString方法*/
@Override
public String toString() {
String retVal;
if(this==RED){
retVal= "RED";
}else if(this==GREEN){
retVal = "GREEN";
}else{
retVal="YELLOW";
}
return retVal;
};
}
2、测试类TrafficLampTest.java
public class TrafficLampTest {
public static void main(String[] args) {
TrafficLamp lamp1 = TrafficLamp.GREEN;
TrafficLamp lamp2 = TrafficLamp.RED;
TrafficLamp lamp3 = TrafficLamp.YELLOW;
System.out.println(lamp1.nextLamp());
System.out.println(lamp2.nextLamp());
System.out.println(lamp3.nextLamp());
}
}
二、枚举的基本使用之交通灯
1、定义一个抽象的类TrafficLamp.java
public enum TrafficLamp {
RED(30){
public TrafficLamp nextLamp(){return GREEN;}
},
GREEN(45){
public TrafficLamp nextLamp(){return YELLOW;}
},
YELLOW(45){
public TrafficLamp nextLamp(){return RED;}
};
public abstract TrafficLamp nextLamp();//抽象方法让子类去实现
private TrafficLamp() {}
private int time;//灯亮的时间
//只供内部调用构造方法
private TrafficLamp(int time){this.time=time;}
public int getTime() {
return time;
}
}
2、测试类TrafficLampTest.java
public class TrafficLampTest {
public static void main(String[] args) {
TrafficLamp lamp1 = TrafficLamp.GREEN;
System.out.println(lamp1);
System.out.println(lamp1.name());
System.out.println(lamp1.toString());
System.out.println(lamp1.getTime());
System.out.println(lamp1.nextLamp());
}
}
3、知识点剖析
当使用"enum"义 枚举类型时,实质上定义出來的类型继承自java.lang.Enum 类型,而每个枚举的成员其实就是您定义的枚举类型的一個实例(Instance).他们都被预设为public final类型,所以您无法改变他们,他们也是 static 成員,所以您可以通过类型名称直接使用他们.
既然继承了Enum类,所以就可以使用它里面的部分方法,如:name()方法 ,返回此枚举常量的名称.Enum类重写了toString方法,返回的也是枚举常量的名称.其他方法的使用也很简单,具体用法可参考api文档.
三、使用场合
作用:某一种事物(对象)提前定义好一组规定的数据,保证填写值合法,不超出规定的数据范围之内.如:定义性别,用户类型等成员变量时,可以封装成一个枚举类型的成员变量,方便使用.
四、总结
枚举类型是一种特殊的类,所以它里面也可以定义属性、方法。但构造方法一定要私有化!因为枚举类里面的成员都是static类型的,所以枚举类可以作为一种单例的实现方式.