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

Java高新技術之列舉


一、為什麼要有列舉?

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

二、普通類模擬實現列舉
  1. 私有的構造方法
  2. 每個元素分別用一個公有的靜態成員變量表示
  3. 可以有若干公有方法或抽象方法。採用抽象方法定義nextDay就將大量的if.else語句轉移成了一個個獨立的類。
public class EnumTest
{


	public static void main(String[] args)
	{
	    WeekDay weekday=WeekDay.MON;
	    System.out.println(weekday);
	    System.out.println(weekday.nextDay());

	}

}

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列舉只有一個成員時,就可以作為一種單例的實現方式。
public class EnumTest
{


	public static void main(String[] args)
	{
       WeekDay day=WeekDay.TUI;
       System.out.println(day);
       System.out.println(day.compareTo(WeekDay.FRI));
       System.out.println(day.ordinal());
       System.out.println(day.name());
       //列舉的靜態方法
       System.out.println(WeekDay.valueOf("SUN"));//引數必須是列舉的元素 否則IllegalArgumentException
       System.out.println(WeekDay.values().length);
       System.out.println("--------------");
       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
	{
		SUN(),MON,TUE(3),WED,TUI,FRI,SAT;//列舉元素必須放在首行
		private WeekDay(){System.out.println("無參構造");};//構造方法必須是private
		private WeekDay(int day){System.out.println("有參構造");}
		
	}
	//定義一個交通燈的列舉類
	public enum TrafficLamp
	{
		RED(30){
			public TrafficLamp nextLamp()
			{
				return GREEN;
			}
		}
		,
		GREEN(45){
			public TrafficLamp nextLamp()
			{
				return YELLOW;
			}
		},
		YELLOW(10)
		{
			public  TrafficLamp nextLamp()
			{
				return RED;
			}
		};
		private int time=0;//設定紅綠藍燈的時間
		private TrafficLamp(int time)//構造方法傳入時間
		{
			this.time=time;
		}
		public abstract TrafficLamp nextLamp();//下一個燈
		
		public String toString()//重寫toString方法
		{
			if(this==RED)
				return "紅燈";
			else if(this==GREEN)
				return "綠燈";
			else
				return "黃燈";
		}
	}
}