Java中枚舉知識點總結

基本概念:

一直對枚舉的知識點和應用場景都不是特別明確,特地花點時間對該知識點進行總結。有不對之處,歡迎指出;前端

枚舉是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枚舉類方法總結(TeacherNumEnum爲例):

在這分爲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:返回此枚舉與指定對象是否匹配
}
複製代碼
相關文章
相關標籤/搜索