一、模拟枚举的实现原理之交通灯
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类型的,所以枚举类可以作为一种单例的实现方式.