1. 程式人生 > >java高新技術:列舉

java高新技術:列舉

為什麼會有列舉?

列舉就是要讓某個型別的變數的取值只能為若干個固定值中的一個,否則,編譯器就會報錯。列舉可以讓編譯器在編譯時就可以控制源程式中填寫的非法值,普通變數的方式在開發階段無法實現這一目標。

普通類模擬實現列舉:

public abstract class WeekDay  
{  
  private WeekDay(){};//構造方法私有化  
  public static final WeekDay SUN=new WeekDay()  
  {  
      public WeekDay nextDay()  
      {  
          return MON;  
      }  
  };  
  public static final WeekDay MON=new WeekDay()  
  {  
      public WeekDay nextDay()  
      {  
          return SUN;  
      }  
  };  
    
//  public WeekDay nextDay()  
//  {  
//    if(this==SUN)  
//        return MON;  
//    else  
//        return SUN;  
//  }  
  public abstract WeekDay nextDay();  
  public String toString()  
  {  
      return this==SUN?"SUN":"MON";  
  }  
}  
列舉的應用:
列舉就相當於一個類,其中也可以定義構造方法、成員變數、普通方法和抽象方法。
列舉元素必須位於列舉體中的最開始部分,列舉元素列表的後要有分號與其他成員分隔。把列舉中的成員方法或變數等放在列舉元素的前面,編譯器報告錯誤。

3.1帶構造方法的列舉
  • 構造方法必須定義成私有的
  • 如果有多個構造方法,該如何選擇哪個構造方法?
  • 列舉元素MON和MON()的效果一樣,都是呼叫預設的構造方法。
3.2帶方法的列舉
  1. 定義列舉TrafficLamp
  2. 實現普通的next方法
  3. 實現抽象的next方法:每個元素分別是由列舉類的子類來生成的例項物件,這些子類採用類似內部類的方式進行定義。
  4. 增加上表示時間的構造方法
3.3列舉只有一個成員時,就可以作為一種單例的實現方式。
package EnumDemo;
/*
 * 列舉相當於一個類,其中也可以定義構造方法,成員變數、普通方法和抽象方法
 * 
 * 列舉元素必須位於列舉體中的最開始部分,列舉元素列表的後面要有分號語氣其他成員隔開,
 * 把列舉中的成員方法或變數,等放在列舉元素的前面,編譯器報告錯誤
 * 
 * 帶構造方法的列舉
 * 	--構造方法必須定義成私有的
 * 	--如果有多個構造方法,該如何選擇哪個構造方法?在元素後面跟上一個括號然後可以選擇有參或者無參的建構函式
 * 	--列舉元素MON和MON()的效果一樣,都是呼叫預設的構造方法
 * 
 * 帶方法的列舉
 * 	--定義列舉TrafficLamp
 * 	--實現普通的next方法
 * 	--實現抽象的next方法,每個元素分別是由列舉類的子類來生成子類例項物件,這些子類才有類似內部誒的方式定義
 * 	--增加上表示時間的構造方法
 * */
public class enumDay 
{
	public static void main(String[] args)
	{
		//WeekDay w = WeekDay.AAA;
		/*
		System.out.println(w);
		System.out.println(w.name());
		System.out.println(w.ordinal());	//返回列舉的序數
		System.out.println(WeekDay.valueOf("CCC"));	//返回帶指定名稱的列舉常量
		System.out.println(WeekDay.values().length);
		*/
		TrafficLamp red = TrafficLamp.RED;
		TrafficLamp green = TrafficLamp.GREEN ;
		TrafficLamp yellow =  TrafficLamp.YELLOW ;
		
		System.out.println(red.nextLamp());
		System.out.println(green.nextLamp());
		System.out.println(yellow.nextLamp());
		
		
		
		
	}
	public enum WeekDay
	{
		AAA,BBB,CCC,DDD,EEE,FFF,GGG;
		private WeekDay()
		{
			System.out.println("空參建構函式");
		}
	}
	
	//交通燈示例:
	public enum TrafficLamp
	{
		RED(10)
		{
			public TrafficLamp nextLamp()
			{
				return GREEN;
			}
		},
		GREEN(20)
		{
			public TrafficLamp nextLamp()
			{
				return YELLOW;
			}
		},
		YELLOW(5)
		{
			public TrafficLamp nextLamp()
			{
				return RED;
			}
		};
		public abstract TrafficLamp nextLamp();		//定義一個抽象方法
		
		private TrafficLamp(int time)		//建構函式必須是私有的,物件一建立所有方法都初始化
		{
			System.out.println(time);
		}
	}
}