­

Java-枚舉(Enum)

1.枚舉概述

枚舉是一個被命名的整型常數的集合,用於聲明一組帶標識符的常熟。當一個變量有幾種固定可能的取值時,就可以將其定義為枚舉類型。

1.1 聲明枚舉

Java中枚舉是一個特殊的類,使用enum關鍵字來定義,常量之間使用逗號’,’來分割。
可定義枚舉名稱、可訪問性基礎類型和成員等,聲明格式如下:

enum-modifiers enum enumname:enum-base {
    enum-body,
}
  1. enum-modifiers 枚舉可訪問性,包含public,private,internal (同一應用程序集內部(單獨的項目,而不是整個解決方案)
  2. enumname 枚舉名稱
  3. enum-base 枚舉的基礎類型 (默認為int)
  4. enum-body 枚舉的成員(枚舉類型的命名常數)

註:任意兩個枚舉成員不能具有相同的名稱,且它的常數值必須在該枚舉的基礎類型的範圍之內,多個枚舉成員之間使用逗號分隔。

2.枚舉類

如1.1所述,Java中的枚舉為特殊的類,均繼承自java.lang.Enum類。每個枚舉類型成員可看作為一個Enum類的實例,默認被final,public,static修飾,使用枚舉類型成員時直接使用枚舉名稱調用成員即可。

枚舉實例常調用的Enum類方法如下:
image
一些具體用法:

public class EnumTest {
	public static void main(String[] args){
		System.out.println(SexEnum.valueOf("male").ordinal());
		System.out.println(SexEnum.values()[0].ordinal());
	}
}

enum SexEnum{
	male,female;
}

3.為枚舉添加方法

枚舉常量可以有自己的方法,此時需注意:
需在枚舉實例的最後一個成員後添加分號,且必須先定義枚舉實例。

eg.創建WeekDay枚舉

enum WeekDay{
	Mon("Monday"),Tue("Tuesday"),Wed("Wednesday"),Thu("Thusday"),
	Fri("Friday"),Sat("Saturday"),Sun("Sunday");

	private String day;

	WeekDay(String day) {
		this.day = day;
	}

	public static String getDay(int i){
		switch(i){
			case 1:
				return WeekDay.Mon.day;
			case 2:
				return WeekDay.Tue.day;
			default:
				System.out.println("Wrong Number!");
				return null;
		}
	}

	//重寫了父類的方法
	@Override
	public String toString() {
		return day;
	}
}

註:若枚舉類中含抽象方法,則需在枚舉類中的每個對象都將其實現

enum SexEnum{
	male{
		public String getSex(){
			return("Male");
		}
	},
	female{
		public String getSex(){
			return("Female");
		}
	};

	public abstract String getSex();
}

4.EnumMap與EnumSet

4.1 EnumMap類

EnumMap 是專門為枚舉類型量身定做的 Map 實現。雖然使用其他的 Map(如 HashMap)實現也能完成枚舉類型實例到值的映射,但是使用 EnumMap 會更加高效。

定義方法:Map<SexEnum, Integer> map1 = new EnumMap<SexEnum, Integer>(SexEnum.class);

4.2 EnumSet類

EnumSet 是枚舉類型的高性能 Set 實現,它要求放入它的枚舉常量必須屬於同一枚舉類型
EnumSet 提供了許多工廠方法以便於初始化,如下所示
image

定義方法:

EnumSet\<SexEnum> set = EnumSet.of(SexEnum.female);
Set\<SexEnum> set1 = EnumSet.complementOf(set);