JDK1.5版本出現的進階特性 Enumeration
枚舉 Enumeration "1.5新特性"
概念:
枚舉就是要讓某個類型的變量取值隻能為若幹個固定值中的一個,否則編譯器就會報錯。
枚舉可以讓編譯器在編譯時就可以控制程式中填寫的非法值;而普通變量的方式在開發階段無法實作這一目标。
WeekDay模拟枚舉的步驟:
1,私有化構造方法
2,每個元素分别用一個公有的靜态成員變量表示
3,可以有若幹共有方法或抽象方法
定義enum枚舉
枚舉是一種特殊的類,每個元素都是該類的一個執行個體對象
枚舉相當于一個類,其中可以定義構造方法、成員變量、普通方法和抽象方法。
枚舉元素必須位于枚舉體中最開始部分,枚舉清單末尾要有";"與其他成員分隔。
枚舉格式:枚舉元素必須位于枚舉最開始部分
帶有構造方法的枚舉(WeekDay)
構造方法必須為私有,如果有多個構造方法,調用由參數清單決定
枚舉元素MON與MON()效果一樣,都是調用預設的構造方法
帶有抽象方法的枚舉(TrafficLamp)
定義枚舉清單
元素實作枚舉中抽象方法nextLamp,每個元素都是枚舉的子類生成的執行個體對象,以内部類的形式定義
從枚舉中程式設計思想的提升
類的方法傳回值類型可以是其本身
類中可以定義靜态常量,該常量資料類型可以是該類的執行個體對象
枚舉類
使用enum聲明,預設直接繼承了java.lang.Enum類,而不是Object類;
枚舉類的對象是固定的,執行個體個數有限,不可以再new,枚舉對象後可以跟()。
枚舉元素必須位于枚舉類體中的最開始部分,枚舉元素後要有分号與其他成員分隔。
枚舉類的構造方法的權限修飾符預設是private;
一旦枚舉對象後面加上{},那麼該對象實際是枚舉匿名内部類對象;
所有枚舉類都提供一個靜态的values()方法(傳回該枚舉類所有對象組成的數組),便于周遊所有枚舉對象;
所有枚舉類都提供一個靜态的valueOf(String name)方法, 傳回枚舉類中對象名等于 name的對象。
若枚舉中隻有一個成員,就可以作為一種"單例"的實作方式
枚舉不可以new();即便是反射也不可以!
是以枚舉型單例模式有着比普通單例有着更高的安全性
======================================================================================
枚舉示例:
package itheima.enhance;
public class EnumeTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WeekDay weekDay = WeekDay.SUN;
System.out.println(weekDay.nextDay());
WeekDay1 weekDay2 = WeekDay1.FRI;
System.out.println(weekDay2);
System.out.println(weekDay2.ordinal());//在枚舉中所處的位置
System.out.println(WeekDay1.valueOf("SUN").toString());//靜态方法
System.out.println(WeekDay1.values().length);//靜态方法:枚舉數組長度
}
public enum WeekDay1{ //定義帶有構造方法的枚舉
//1,元素清單必須放在最前,否則編譯報錯,枚舉清單後面有操作的話要加上“;”
//2,枚舉的構造方法必須定義成私有,一般方法無此限制
SUN(1),MON,TUE,WED,THU,FRI,SAT;//元素是靜态的,初始化時會調用構造方法(7次)
private WeekDay1(){System.out.println("1");}
private WeekDay1(int day){System.out.println("222");}//兩個構造法方法,空/實參
}
public enum TrafficLamp{ //帶有抽象方法的枚舉
RED(30){
public TrafficLamp nextLamp(){//實作抽象方法
return GREEN;
}
},
GREEN(40){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(10){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();//抽象方法
private int time;
private TrafficLamp(int time){this.time=time;}//有參de構造方法
}
}