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());
}
}