從java1.5開始產生的新特性,通過關鍵字enum來定義枚舉類。枚舉類一般用來表示一組相同類型的值,其中包含有限個命名的值。枚舉類是一種特殊的類,它也可以有自己的成員變量、方法,可以實現一個或者多個接口,還可以定義自己的構造器。
與一般類的區別:
1、一般的類都是默認繼承Object類,而枚舉類默認繼承的是Java.lang.Enum類。所以枚舉類不能顯示繼承其他的父類;
2、使用enum定義的非抽象枚舉類,默認使用final修飾;
3、枚舉類的構造器只能使用private修飾;枚舉類的實例只能是枚舉值,不能隨意通過new關鍵字創建枚舉類對象;
4、枚舉類的所有實例必須放在第一行顯式列出,否則此枚舉類永遠不能產生實例;
5、枚舉類的實例,系統默認用public static final修飾
public enum Color {
RED("R"),BLUE("b"),YELLOW("y");
private final String abbreviation;
private Color(String abbreviation) {
this.abbreviation = abbreviation;
}
public String getAbbreviation() {
return abbreviation;
}
public static void main(String[] args) {
Color color1 = Color.BLUE; //直接指對對象的值
//values方法可以得到此枚舉類的所有實例
for (Color color : Color.values()){
System.out.println(color);
}
}
}
由於枚舉類的實例有可能只是固定的幾個值,如果使用set方法修改可能會引起一些錯誤,建議將枚舉類的成員變量都使用private final修飾。
舉個例子:
package com.company;
public enum People {
RED("R"),BLUE("b"),YELLOW("y");
private String sex;
private People(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
switch (this){
case RED:
if (sex == "男"){
this.sex = sex;
}else {
System.out.println("未知操作");
return;
}
break;
case BLUE:
if (sex == "女"){
this.sex = sex;
}else {
System.out.println("未知操作");
return;
}
break;
case YELLOW:
if (sex == "未知"){
this.sex = sex;
}else {
System.out.println("未知操作");
return;
}
break;
}
}
public static void main(String[] args) {
People people = People.valueOf("BLUE");
people.setSex("男"); //輸出 ”未知操作“
}
}
在此代碼中由於沒有將sex變量設置爲final,允許使用set方法去設置,導致後面sex沒有設置成功,輸出了“未知操作”。