1. 程式人生 > >Java高新技術-列舉

Java高新技術-列舉

說明:當一個類的物件個數固定,且不需要再建立這個類新的物件時,可以考慮用列舉。

一,列舉原理

列舉型別特有:

1.私有構造方法;

2.每個元素分別用一個公有的靜態成員變量表示;

3.可以有若干個公有方法或抽象方法,抽象方法可以使每個元素(本類物件)通過覆蓋具有自己獨特的內容;

注:列舉型別的元素就是本類物件,但是限制了使用者自己創新的物件,只能使用該類提供的物件->元素。

列舉是為了讓這個型別的變數的取值只能為若干固定值中的一個。

列舉程式碼原理舉例一:

class Weekday{
				//私有構造方法可以防止外部建立本類新物件;
				//保證建立個數;
				private Weekday(){};
				//通過公有靜態的本類物件的成員,為外部提供了獲取該類物件的途徑;
				//而且本類物件個數是可控,確定。
				public static Weekday MONDAY=new Weekday();
				public static Weekday TUESDAY=new Weekday();
				public static Weekday WEDNESDAY=new Weekday();
				public static Weekday THURSDAY=new Weekday();
				public static Weekday FRIDAY=new Weekday();
				public static Weekday SATURDAY=new Weekday();
				public static Weekday SUNDAY=new Weekday();
				
				public Weekday nextDay(){
					/*本方法為非靜態方法,當外部通過如
					 * Weekday today=Weeday.FRIDAY;
					 * 獲取到本類物件後,就可以通過物件呼叫非靜態方法
					 */
					if(this==MONDAY)
						return TUESDAY;
					if(this==TUESDAY)
						return WEDNESDAY;
					if(this==WEDNESDAY)
						return THURSDAY;
					if(this==THURSDAY)
						return FRIDAY;
					if(this==FRIDAY)
						return SATURDAY;
					//if(this==SATURDAY)
					return SUNDAY;
				}
				public String toString(){
					if(this==MONDAY)
						return "MONDAY";
					if(this==TUESDAY)
						return "TUESDAY";
					if(this==WEDNESDAY)
						return "WEDNESDAY";
					if(this==THURSDAY)
						return "THURSDAY";
					if(this==FRIDAY)
						return "FRIDAY";
					if(this==SATURDAY)
						return "SATURDAY";
					return "SUNDAY";
				}	
			}

列舉程式碼原理舉例二:

因為對於Weekday類物件,每一個nextDay方法對應的結果都是不同而且固定的,這裡可以採用將nextDay變為抽象方法,在建立元素時通過覆蓋nextDay方法,將該方法返回值設為需要的指定結果。這樣避免你了上面例子中多個if...else...的語句重複選擇。

abstract class Weekday{
				//私有構造方法可以防止外部建立本類新物件;
				//保證建立個數;
				private Weekday(){};
				//通過公有靜態的本類物件的成員,為外部提供了獲取該類物件的途徑;
				//而且本類物件個數是可控,確定。
				public static Weekday MONDAY=new Weekday(){
					public Weekday nextDay(){		
							return TUESDAY;
					}
				};
				public static Weekday TUESDAY=new Weekday(){
					public Weekday nextDay(){		
						return WEDNESDAY;
					}
				};
				public static Weekday WEDNESDAY=new Weekday(){
					public Weekday nextDay(){		
						return THURSDAY;
					}
				};
				public static Weekday THURSDAY=new Weekday(){
					public Weekday nextDay(){		
						return FRIDAY;
					}
				};
				public static Weekday FRIDAY=new Weekday(){
					public Weekday nextDay(){		
						return SATURDAY;
					}
				};
				public static Weekday SATURDAY=new Weekday(){
					public Weekday nextDay(){		
						return SUNDAY;
					}
				};
				public static Weekday SUNDAY=new Weekday(){
					public Weekday nextDay(){		
						return MONDAY;
					}
				};
				
				
				public String toString(){
					if(this==MONDAY)
						return "MONDAY";
					if(this==TUESDAY)
						return "TUESDAY";
					if(this==WEDNESDAY)
						return "WEDNESDAY";
					if(this==THURSDAY)
						return "THURSDAY";
					if(this==FRIDAY)
						return "FRIDAY";
					if(this==SATURDAY)
						return "SATURDAY";
					return "SUNDAY";
				}	
			}

二,列舉

下面介紹列舉的應用。

示例1:列舉常見方法

在一個類內建立一個列舉,此時列舉類內部類,可以用成員修飾詞來修飾。

public class Test {	
	public static void main(String[] args) throws Exception{
		//獲取列舉元素方法。
		Weekday today=Weekday.MON;
		//獲取元素在列舉中的位置
		System.out.println(today.ordinal());
		//獲取元素的列舉類名
		System.out.println(today.getClass());
		//通過名稱獲取列舉的指定元素
		System.out.println(Weekday.valueOf("FRI"));
		//獲取列舉中所有元素
		Weekday[] days=Weekday.values();
		
	}
	public enum Weekday{
		//元素名稱必須寫在列舉類的第一行
		SUN(),MON(1),TUE,WED,THU,FRI,SAT;
		//構造方法不寫,如果要構造方法,則必須修飾為私有private;
		private Weekday(){
			System.out.println("無參建構函式");
		}
		/*當喲多個構造方法時,可以在元素後面加();
		 *並在()內根據構造方法的形參格式傳值;
		 *就會呼叫相應的構造方法
		 *如元素後面不加(),則預設呼叫無參建構函式
		 */
		private Weekday(int a){
			System.out.println("有參建構函式"+a);
		}
		public String toString(){
			if(this==MON)
				return "MONDAY";
			if(this==TUE)
				return "TUESDAY";
			if(this==WED)
				return "WEDNESDAY";
			if(this==THU)
				return "THURSDAY";
			if(this==FRI)
				return "FRIDAY";
			if(this==SAT)
				return "SATURDAY";
			return "SUNDAY";
		}
	}
}

示例2:包含抽象方法的列舉

在類內建立列舉時(即內部類列舉)如果列舉裡有抽象方法,列舉類名前不需要加abstract關鍵詞,列舉中每個元素要重寫該抽象方法。

 enum TrafficLamp{
	RED(30){
		//元素需要重寫列舉方法
		public  TrafficLamp nextLamp(){
			return GREEN;
		}
	},
	GREEN(45){
		public  TrafficLamp nextLamp(){
			return YELLOW;
		}			
	},
	YELLOW(5){
		public  TrafficLamp nextLamp(){
			return RED;
		}			
	};
	//列舉中的抽象方法
	public abstract TrafficLamp nextLamp();
	private int time;
	//列舉中的有參函式
	private TrafficLamp(int time){this.time = time;}
}

示例3:列舉只有一個成員是,就可以作為一種單例的實現方式

 enum Student{
	LiSi;
	//私有建構函式
	private Student(){};
}