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類方法如下:



一些具體用法:

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 提供了許多工廠方法以便於初始化,如下所示

定義方法:

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