今天经理要求项目中用枚举,于是试验将原来的常量改成了枚举
原来的代码
// 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) {
...
}