将项目中的常量改成枚举设计

今天经理要求项目中用枚举,于是试验将原来的常量改成了枚举
原来的代码

  // CourseConstant.COURSE_TYPE_NO_REPORT是一个常量
  if(CourseConstant.COURSE_TYPE_NO_REPORT.equals(course.getCourseType())){
   	        业务
   }
   //..............

// 常量类
public class CourseConstant  {
    // 非公开课
    public static final String COURSE_TYPE_NO_REPORT = "02";
    // 公开课
    public static final String COURSE_TYPE_HAS_REPORT = "01";
}

那么要怎么改造呢?首先要定义一个枚举类

public enum CourseENum {
}

接下来怎么做呢?和普通的类一样,要定义私有private属性,这个private属性需要是什么内容呢?
这里引入两个private属性:
一个是定义值即01,02,我们将其定义为code
另一个则定义的是值的含义,分别是公开课和非公开课。我们将其定义为msg
并且业务中要获得这两个值,所以要写上get方法,
而set方法则不使用,因为我们要用枚举对属性赋值而不是set方法
于是变成了下面那样

public enum CourseENum {

    private String code;
    private String msg;
    
    public String getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }

}

自此已经成功了一半,枚举类类已经基本完成,接下来就是枚举的构建
首先我们要引入构造函数,所有的枚举的格式都要按照构造函数的形式传参

public enum CourseENum {

	private CourseENum(String code,String msg){
        this.code = code;
        this.msg = msg;
    }
    private String code;
    private String msg;
    public String getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
}

这里的构造函数关键字为private,也可以不加默认为private,设别的不行原因等会说
然后引入枚举,将其定义为NO_REPORT 和 HAS_REPORT

public enum CourseENum {

    NO_REPORT("02","非公开课"),

    HAS_REPORT("01","公开课");

    
    private CourseENum(String code,String msg){
        this.code = code;
        this.msg = msg;
    }
    private String code;
    private String msg;

    public String getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }

    
}

自此已经完成枚举类的设计,接下来就是对原来方法的改造

 // 改造前使用常量
 if(CourseConstant.COURSE_TYPE_NO_REPORT.equals(course.getCourseType())){
   	        业务
   }
   
   // 改造后使用枚举
if(CourseENum.NO_REPORT.getCode().equals(course.getCourseType())){
   	        业务
   }

可以发现当一打出来CourseENum.就出来对应的值和含义了,非常一目了然赏心悦目呢
请添加图片描述

改造完成,接下来就是一些附加的解释,为何要枚举的构造器要用private修饰
我的理解是:仅有 NO_REPORT 和 HAS_REPORT 这两个枚举会调用构造器(这两是放在CourseENum里定义的所以可以调到),CourseENum不能进行外部实例化

// 此写法会报错,无法进行实例化
CourseENum courseENum = new CourseENum();

// 此写法正确
CourseENum noReport = CourseENum.NO_REPORT;

然后发现一个很有趣的现象,枚举类的返回值是一个字符串

// getCode()会为字符串,此处是可以的
if(CourseENum.NO_REPORT.getCode().equals(course.getCourseType())){}

// CourseENum.NO_REPORT枚举类返回值也为字符串,此处也是可以的
// 此时字符串值为NO_REPORT
if(CourseENum.NO_REPORT.equals(course.getCourseType())){}

CourseENum.NO_REPORT的返回值就是一个值为"NO_REPORT"的字符串,如果要改成别的怎么办呢?
答案是在枚举类里添加toString()方法

public enum CourseENum {

    NO_REPORT("02","非公开课"),

    HAS_REPORT("01","公开课");


    private CourseENum(String code,String msg){
        this.code = code;
        this.msg = msg;
    }
    private String code;
    private String msg;

    public String getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }

    @Override
    public String toString() {
        return "1111111111";
    }
}

发现已经变为111111了,非常有趣
请添加图片描述

参考别人的枚举设计

@Getter
@AllArgsConstructor
public enum UserType {

    /**
     * pc端
     */
    SYS_USER("sys_user"),

    /**
     * app端
     */
    APP_USER("app_user");



    private final String userType;

	
    public static UserType getUserType(String str) {
    	// 此处进入values就会跳回到UserType里,所以values就是userType遍历的所有枚举
        for (UserType value : values()) {
            if (StringUtils.contains(str, value.getUserType())) {
                return value;
            }
        }
        throw new RuntimeException("'UserType' not found By " + str);
    }
}

也可以这样使用

UserType userType = UserType.getUserType(loginUser.getUserType());
        if (userType == UserType.SYS_USER) {
			...
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值