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
。