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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值