天天看點

基礎加強____JDK1.5高新特性之__【枚舉】

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構造方法
		
	}
}