一、模擬枚舉的實現原理之交通燈
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類型的,所以枚舉類可以作爲一種單例的實現方式.