java基礎之枚舉類型enum

1.基本使用

JDK API在1.5版本以前只能用接口定義常量,這也是初級程序員比較熟知的方式,比如:

public interface Season {
    public static final int SPRING = 0;
    public static final int SUMMER = 1;
    public static final int AUTUMN = 2;
    public static final int WINTER = 3;
}

這已經比大多數硬編碼的馬畜好很多了嘛,不過JDK1.5以后推薦使用一種的優雅方式定義常量就是枚舉。比如上面的代碼就可以這樣修改:

public enum Season {
    Spring,Summer,Autumn,Winter;
}

是不是簡潔了很多,不止如此還有如下好處:

  • 1.編譯期間限定類型,不會發生越界
    例如:
public void toColor(int season){
        switch (season){
            case Season.SPRING:
                System.out.println("綠色");
                break;
            case Season.SUMMER:
                System.out.println("紅色");
                break;
            case Season.AUTUMN:
                System.out.println("白色");
                break;
            case Season.WINTER:
                System.out.println("黑色");
                break;
            default:
                System.out.println("錯誤!");
                break;
        }
    }

接口定義的常量有具體類型,在運行時才會發現越界情況,要么提前判斷范圍,要么運行時做好異常處理;如果改為enum類型,在編譯期就會鎖定變量范圍,上面代碼就不需要default處理。

  • 2.enum類型有內置方法
    每個枚舉都是java.lang.Enum的子類,該基類提供了諸如獲得排序值的ordinal方法、compareTo比較方法等,大大簡化了常量的訪問。比如,列出所有枚舉值:
public static void main(String[] args){ 
    for(Season s:Season.values()){ 
        System.out.println(s); 
    } 
} 
  • 3.enum類型的高級用法
    枚舉類型可以通過成員變量和構造方法來定義復雜的常量類型。枚舉類型的基本想法是:通過共有的靜態final域為每個枚舉常量導出一個實例。枚舉類型沒有可以訪問的構造器,客戶端不能創建枚舉類型的實例,也不能對它進行擴展,因此只存在聲明過程的枚舉常量。也就是枚舉類型是實例受控的。枚舉是單例的范型化,單例的本質是單元素的枚舉。示例:
public enum StatusPublicEnum {
    //多個實例用逗號分隔,必須寫在構造方法前面
    FAIL("失敗", "300", "認證系統"),
    OK("成功", "200", "認證系統");

    private final String msg;
    private final String status;
    private final String code;

    StatusPublicEnum(String msg, String status, String code) {
        this.msg = msg;
        this.status = status;
        this.code = code;
    }

    public String toJson() throws Exception {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("msg",this.msg);
        jsonObject.put("status",this.status);
        jsonObject.put("code",this.code);
        return jsonObject.toCompactString();
    }

    public static void main(String[] args) throws Exception {
        System.out.println(StatusPublicEnum.FAIL.toJson());
        System.out.println(StatusPublicEnum.OK.toJson());
    }

}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容