Java中的枚舉類指的是,只能創造一定數量的物件,不可以隨便創建新的。
例如:
星期:星期一~星期日
月份:一月~十二月
季節 :春、夏、秋、冬
JDK5.0以前,並沒有提供enum 的關鍵字使用,必須自己定義。
public class Season {
private final String seasonName;
private final String seasonDesc;
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public String getSeasonName() {
return this.seasonName;
}
public String getSeasonDesc() {
return this.seasonDesc;
}
public static final Season SPRING = new Season("春天", "春天下雨");
public static final Season SUMMER = new Season("夏天", "夏天好熱");
public static final Season AUTUMN = new Season("秋天", "秋天涼快");
public static final Season WINTER = new Season("冬天", "冬天好冷");
}
public class SeasonTest {
public static void main(String[] args) {
System.out.println(Season.SPRING.getSeasonName()); // 春天
}
}
屬性 定義成private 、final 的方式,讓使用的人無法進行修改。構造器 定義成private ,無法透過new 的方式將類實例化 。public static final 的方式將這幾個所需要的物件實例化為靜態且無法更改 。JDK5.0開始,可以使用enum 關鍵字去創建枚舉類。
public enum Season {
SPRING("春天", "春天下雨"),
SUMMER("夏天", "夏天好熱"),
AUTUMN"秋天", "秋天涼快"),
WINTER("冬天", "冬天好冷");
private final String seasonName;
private final String seasonDesc;
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public String getSeasonName() {
return this.seasonName;
}
public String getSeasonDesc() {
return this.seasonDesc;
}
}
public class SeasonTest {
public static void main(String[] args) {
System.out.println(Season.SPRING.getSeasonName()); // 春天
}
}
直接在enum最上方使用實例名稱()並且用,將不同的實例分隔即可,也可以將要賦值的部分直接寫在()。
使用enum 實作interface 時有兩種情況:
共用同一個實作方法
interface A {
void method() {}
}
enum B implements A {
Z,Y,X;
void method() {
System.out.println("B");
}
}
public class BTest {
public static void main(String[] args) {
B.Z.method(); // B
B.Y.method(); // B
B.X.method(); // B
}
}
將實作的方法寫在enum B 中時,enum B 中實例化的Z 、Y 、X 使用同一個method() 。
單獨使用自己的實作方法
interface A {
void method() {}
}
enum B implements A {
Z() {
void method() {
System.out.println("Z");
}
},
Y() {
void method() {
System.out.println("Y");
}
},
X() {
void method() {
System.out.println("X");
}
};
void method() {}
}
public class BTest {
public static void main(String[] args) {
B.Z.method(); // Z
B.Y.method(); // Y
B.X.method(); // X
}
}
透過這樣的方式,可以在各自的實例中,實作interface A 中的method() 方法。
Enum 本身也是屬於一個類,並且也是繼承java.lang.Ojbect ,當中有幾個常用的靜態方法 。
toString() :預設是會返回實例 的名稱。如:B.Z.toString(); 會返回Z 。values() :返回該enum 類型的陣列。如:B.values(); 會返回[{Z},{Y},{X}] 。valuesOf(String objName) :返回該enum 類型的objName 實例。如:B.valueOf("Z"); 會返回Z 的實例,若該enum 中沒有objName 的實例會出現IllegalArgumentException 的錯誤(參數錯誤的意思)而不是null。