因为之前在和一个同事交接项目的时候,因为许多判断的条件都是凭空臆想的,注释写的不够清晰、用词不够明确,代码可读性较差,给别人带来了很大困扰。在接触到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