Java枚舉類Enum的基本使用

    因爲之前在和一個同事交接項目的時候,因爲許多判斷的條件都是憑空臆想的,註釋寫的不夠清晰、用詞不夠明確,代碼可讀性較差,給別人帶來了很大困擾。在接觸到enum類之後,感覺不錯,可以很大程度上的解決我的困擾。於是便分享出來!

    參考文章:https://www.bilibili.com/read/cv5140736

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章