一直對枚舉的知識點和應用場景都不是特別明確,特地花點時間對該知識點進行總結。有不對之處,歡迎指出;前端
枚舉是JDK1.5出的新特性。它是一種特殊數據類型,可以爲一個變量定義一組預約義的常量。變量必須等於爲其預約義的值之一。同時在JDK1.6中switch也支持枚舉進行邏輯判斷。java
枚舉經過enum關鍵字進行定義。默認都是java.lang.Enum(Enum屬於抽象類)的子類。同時枚舉類型的每一個值都會映射到Enum抽象類中的構造方法。源碼以下:數組
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
//Enum.java:117-120行
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
}
複製代碼
一、簡單版,代碼以下:編輯器
/** * TestEnum.java * TestEnum 聲明枚舉 * RED,GREEN,BLUE 預約義的常量 **/
public enum TestEnum {
RED,GREEN,BLUE;
}
//TestMain.java
class TestMain {
public static void main(String[] args){
for(TestEnum test : TestEnum.values()){
System.out.println(test);
}
}
}
//執行結果
RED
GREEN
BLUD
複製代碼
以上代碼其實執行了3次Enum抽象類的構造方法。能夠打斷點調試下ide
//相似執行了3次
/** *第一個參數爲值的名稱 *第二個參數爲值的序號 **/
new Enum<TestEnum>("RED",0);
new Enum<TestEnum>("GREEN",1);
new Enum<TestEnum>("BLUE",2);
複製代碼
二、以上代碼我都不知道RED、GREEN、BLUE是幹啥的。枚舉能夠實現相似key:val結構的形式嗎?能夠的,Java容許咱們在枚舉類中添加任意方法,經過該機制,咱們就能夠添加所謂的描述了。代碼以下:this
/** * TestEnum.java * TestEnum 聲明枚舉 * RED,GREEN,BLUE 預約義的常量 **/
public enum TestEnum {
RED("red","紅色"),GREEN("green","綠色"),BLUE("blue","藍色");
private String code;
private String desc;
TestEnum(String code,String desc){
this.code=code;
this.desc=desc;
}
public String getCode(){
return code;
}
public void setCode(String code){
this.code=code;
}
public String getDesc(){
return desc;
}
public void setDesc(String desc){
this.desc=desc;
}
public static HashMap toMap(){ //枚舉轉成Map(前端的JSON)
HashMap map=new HashMap();
for(TestEnum test:TestEnum.values()){
map.put(test.getCode(),test.getDesc());
}
return map;
}
}
//TestMain.java
class TestMain {
public static void main(String[] args){
for(TestEnum test : TestEnum.values()){
System.out.println(test.getDesc());
}
}
}
//執行結果
紅色
綠色
藍色
複製代碼
以上方式能夠用來作HTTP請求響應返回JSON數據格式;idea
三、帶抽象方法的枚舉類;例如:按不一樣班級不一樣學生,分配不一樣老師數。A、B、C這3個班。A班學生達到30人,分配2個老師;B班學生達到40人,分配3個老師;C班學生達到50人,分配4個老師;代碼實現以下:spa
//枚舉文件TeacherNumEnum.java
public enum TeacherNumEnum{
A("30人") {
public int distribute(){
return 2;
}
};
B("40人") {
public int distribute(){
return 3;
}
};
C("50人") {
public int distribute(){
return 4;
}
};
private String desc; //人數描述
TaskTypeEnum(String desc){
this.desc=desc;
}
public String getDesc(){
return desc;
}
public abstract int distribute();
}
//TestMain.java
class TestMain {
public static void main(String[] args){
for(TeacherNumEnum task : TeacherNumEnum.values()){
System.out.println(task.getDesc()+";分配老師人數:"+task.distribute());
}
}
}
//執行結果
30人;分配老師人數:2
40人;分配老師人數:3
50人;分配老師人數:4
複製代碼
四、枚舉類不存在繼承關係,可是能夠實現接口。使用extends實如今idea編輯器就會有報錯提示。在枚舉類中實現接口,是對枚舉類的一種約束。能夠自行碼下;調試
在這分爲Enum類方法和枚舉類值方法code
//Enum類方法總結:
TeacherNumEnum.values()://Enum[]://返回Enum數組,因此for能夠循環
TeacherNumEnum.valueof("枚舉值"); //Enum:返回相應的枚舉值
//Enum類值方法總結:
for(TeacherNumEnum task : TeacherNumEnum.values()){
task.ordinal(); //int:返回枚舉值相應的序號
task.name(); //String:返回枚舉值名稱
task.toString(); //String:返回枚舉值名稱字符串
task.compareTo(E o); //int:返回此枚舉與指定對象的順序
task.equals(E o); //boolean:返回此枚舉與指定對象是否匹配
}
複製代碼