枚舉


爲什麼要有枚舉

  • 問題:要定義星期幾或性別的變量,該怎麼定義?假設用1-7分別表示星期一星期日,但有人可能會寫成int weekday =0
  • 枚舉就是要讓某個類型的變量的取值只能爲若干個固定值中的一個,否則,編譯器就會報錯。枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,普通變量的方式在開發階段無法實現這一目標。
用普通類如何實現枚舉類的功能,定義一個Weekday的類來模擬枚舉的功能。

  • 私有的構造方法
  • 每個元素分別用一個公有的靜態成員變量表示
  • 可以有若干公有方法或抽象方法,例如,要提供nextDay方法必須是抽象的。

我們現在來思考這樣的應用,每一個星期得到這個對象後都可以調用它的nextDay方法來得到下一天是星期幾,先想到的是下面的代碼:

爲了演示方便我將星期定位兩天。

package cn.itcast.day1;

public  class CopyOfWeekDay1
{
	private CopyOfWeekDay1()
	{
	}

	public final static CopyOfWeekDay1 SUN = new CopyOfWeekDay1();

	public final static CopyOfWeekDay1 MON = new CopyOfWeekDay1();

	public CopyOfWeekDay1 nextDay()
	{
		if (this == SUN)
		{
			return MON;
		} else
		{
			return SUN;
		}
	}
}

測試類如下:

package cn.itcast.day1;

import java.util.Date;

public class CopyOfEnumTest
{

	public static void main(String[] args)
	{

		CopyOfWeekDay1 weekDay = CopyOfWeekDay1.MON;
		System.out.println(weekDay.nextDay());
	}
}
由於如果採用上面的方法構建枚舉,nextDay會有大量的if{}else{}語句塊,爲了方便現在又該如下:

package cn.itcast.day1;

public abstract class WeekDay2
{
	private WeekDay2()
	{
	}

	public final static WeekDay2 SUN = new WeekDay2()
	{
		@Override
		public WeekDay2 nextDay()
		{

			return MON;
		}

	};
	public final static WeekDay2 MON = new WeekDay2()
	{
		@Override
		public WeekDay2 nextDay()
		{

			return SUN;
		}

	};

	public abstract WeekDay2 nextDay();

	public String toString()
	{
		return this == SUN ? "SUN" : "MON";
	}
}

把該類定義爲一個抽象類,公有的方法也定義爲抽象的,接下來使用匿名內部類產生實例對象覆蓋抽象方法。

總結:枚舉是一種特殊的類,其中每個元素都是該類的一個實例對象,例如可以調用WeekDay.SUN.getClass().getName()和WeekDay.class.getName().

我們來這樣定義一個枚舉:

public enum WeekDay{
		SUN,MON,TUE,WED,THI,FRI,SAT
	}

我們可以使用枚舉類給我們提供的方法:

	WeekDay weekDay2 = WeekDay.FRI;
		System.out.println(weekDay2);
		System.out.println(weekDay2.name());
		System.out.println(weekDay2.ordinal());	
		System.out.println(WeekDay.valueOf("SUN").toString());
		System.out.println(WeekDay.values().length);


我們在枚舉類中定義的方法都必須放在元素列表之後,記住加;號。

我們可以實現帶構造方法的枚舉:

  • 構造方法必須定義成私有的
  • 如果有多個構造方法,如果有多個構造方法,該如何選擇哪個構造方法?
  • 枚舉元素MON和MON()的效果一樣,都是調用默認的構造方法。

	public enum WeekDay
	{
	SUN(1),MON(),TUE,WED,THI,FRI,SAT;
	private WeekDay(){System.out.println("first");}
	private WeekDay(int day){System.out.println("second");}
	}
實現帶有抽象方法的枚舉:


首先我們先定義如下:

	public enum TrafficLamp{
		RED,GREEN,YELLOW;
		public abstract TrafficLamp nextLamp();
	}
然後實現方法,因爲每一個元素就是一個該枚舉類的實例對象,所以我們可以這樣實現:

public 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;}
	}

上面的枚舉還分別爲各種燈定義了時間。
枚舉就相當於一個類,其中也可以定義構造方法、成員變量、普通方法和抽象方法。

枚舉元素必須位於枚舉體中最開始的部分,枚舉元素列表的後面要有分號與其他成員分隔。

枚舉只有一個成員時,就可以作爲一種單例的實現方式。


發佈了25 篇原創文章 · 獲贊 21 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章