因爲之前在和一個同事交接項目的時候,因爲許多判斷的條件都是憑空臆想的,註釋寫的不夠清晰、用詞不夠明確,代碼可讀性較差,給別人帶來了很大困擾。在接觸到enum類之後,感覺不錯,可以很大程度上的解決我的困擾。於是便分享出來!
1.概述
枚舉類是Java5中新增的特性,它是一種新增的類類型,與class、interface具有相同的地位。在Java5之前,定義常量主要定義一個常量類或者常量接口。Java5之後,在定義常量時,可以通過枚舉類來定義常量。對比於之前傳統的常量的定義,枚舉類中定義的常量代碼的可讀性更強,允許進行編譯時檢查,避免傳值無效的情況出現。
默認情況下,enum是繼承 java.lang.Enum類的不能再繼承其他類,但是可以實現其他的接口。在enum中,所有的實例必須在第一行列出,列出這些實例之後系統會自動添加public static final 修飾,不需要再添加public static final 修飾。
2.枚舉類的使用
a.枚舉類的基本用法 (單值類型的枚舉類)
枚舉類的定義,以三種用戶作爲枚舉類型
//枚舉類型
public enum UserRole {
ROLE_ROOT_ADMIN, //系統管理員
ROLE_ORDER_ADMIN, //訂單管理員
ROLE_NORMAL //普通用戶
}
測試類
//可用於 if/else或者switch中的字段的說明 循環判斷條件
//可以比較清晰的體現出判斷條件 而不是 1 2 3這樣的判斷條件 不夠清晰
//單值情況下實際應用下的意義不大
public class TestEnum {
public static void main(String[] args) {
UserRole role1 = UserRole.ROLE_ROOT_ADMIN;
UserRole role2 = UserRole.ROLE_ORDER_ADMIN;
UserRole role3 = UserRole.ROLE_NORMAL;
//values()方法:返回所有枚舉常量的數組集合
for(UserRole role:UserRole.values()) {
System.out.println(role);
}
//打印結果
// ROLE_ROOT_ADMIN
// ROLE_ORDER_ADMIN
// ROLE_NORMAL
//ordinal()方法:返回枚舉常量的序數 0開始
System.out.println(role1.ordinal());
System.out.println(role2.ordinal());
System.out.println(role3.ordinal());
//結果
// 0
// 1
// 2
//compareTo()方法:枚舉常量之間的比較
System.out.println(role1.compareTo(role1));
System.out.println(role1.compareTo(role2));
System.out.println(role1.compareTo(role3));
//結果
// 0
// -1
// -2
//name()方法:獲取到枚舉常量的名稱
System.out.println(role1.name());
System.out.println(role2.name());
System.out.println(role3.name());
//結果
// ROLE_ROOT_ADMIN
// ROLE_ORDER_ADMIN
// ROLE_NORMAL
//valueof()方法:返回指定名稱的枚舉常量
System.out.println(UserRole.valueOf("ROLE_ROOT_ADMIN"));
System.out.println(UserRole.valueOf("ROLE_ORDER_ADMIN"));
System.out.println(UserRole.valueOf("ROLE_NORMAL"));
//結果
// ROLE_ROOT_ADMIN
// ROLE_ORDER_ADMIN
// ROLE_NORMAL
}
}
b.多值類型的枚舉類
多值情況下枚舉類的定義
//枚舉多值情況
//可以像class一樣在 類中聲明屬性、定義 構造函數和 成員(get set)方法
public enum UserRoleMore {
ROLE_ROOT_ADMIN("系統管理員",00000), //系統管理員
ROLE_ORDER_ADMIN("訂單管理員",00001), //訂單管理員
ROLE_NORMAL("普通用戶",00002), //普通用戶
;
//自定義屬性
private String roleName; //角色名
private Integer roleCode; //角色編碼
//自定義構造函數
UserRoleMore(String roleName,Integer roleCode){
this.roleName = roleName;
this.roleCode = roleCode;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public Integer getRoleCode() {
return roleCode;
}
public void setRoleCode(Integer roleCode) {
this.roleCode = roleCode;
}
//通過code來返回name的值
public static String getRoleCodeByName(int code) {
for(UserRoleMore enums:UserRoleMore.values()) {
if(enums.getRoleCode().equals(code)) {
return enums.getRoleName();
}
}
return null;
}
}
測試類
//多值的枚舉類的測試
public class TestEnum2 {
public static void main(String[] args) {
int a = 00000;
String name = UserRoleMore.getRoleCodeByName(a);
System.out.println(name);
//測試結果
//系統管理員
}
}
c.枚舉+接口的模式
接口類
//公用接口 枚舉實現的接口
public interface RoleOperation {
public String op();
}
枚舉類+接口模式下的enum
//枚舉類中 每一個枚舉都實現接口中的方法
public enum UserRoleInterface implements RoleOperation{
ROLE_ROOT_ADMIN("系統管理員",00000){
@Override
public String op() {
// TODO Auto-generated method stub
return "ROLE_ROOT_ADMIN:"+"is A permission";
}
}, //系統管理員
ROLE_ORDER_ADMIN("訂單管理員",00001){
@Override
public String op() {
// TODO Auto-generated method stub
return "ROLE_ORDER_ADMIN:"+"is B permission";
}
}, //訂單管理員
ROLE_NORMAL("普通用戶",00002){
@Override
public String op() {
// TODO Auto-generated method stub
return "ROLE_ORDER_ADMIN:"+"is C permission";
}
} //普通用戶
;
//自定義屬性
private String roleName; //角色名
private Integer roleCode; //角色編碼
//自定義構造函數
UserRoleInterface(String roleName,Integer roleCode){
this.roleName = roleName;
this.roleCode = roleCode;
}
}
測試類
public class TestEnum3 {
public static void main(String[] args) {
TestEnum3 t3 = new TestEnum3();
String roleName="ROLE_ROOT_ADMIN";
System.out.println(t3.judge(roleName));
//測試結果
//ROLE_ROOT_ADMIN:is A permission
}
public String judge(String roleName) {
return UserRoleInterface.valueOf(roleName).op();
}
}
枚舉其實還可以實現設計模式,例如單例模式、策略模式,而且枚舉中還有枚舉特有的集合類如EnumSet和EnumMap,具體就不細說了。有興趣的朋友可以去看這篇文章,寫的很好:https://www.bilibili.com/read/cv5140736。
參考文章
非常感謝作者允許我引用這篇博文的內容:https://www.bilibili.com/read/cv5140736