@JunQiu
2019-11-22T11:24:40.000000Z
字数 1252
阅读 1807
summary_2019/11
language_java
枚举类型在实际开发中是比较不错,可以让我们的代码可读性、可维护性更好,但是也有一定的缺陷;因此什么时候用它,怎么用好它是一个值得思考的问题。
# 我们在下面通过一个简单的小例子看什么是枚举:
public enum Week {
MONDAY(1, "星期一"),
TUESDAY(2, "星期二"),
WEDNESDAY(3, "星期三"),
THURSDAY(4, "星期四"),
FRIDAY(5, "星期五"),
SATURDAY(6, "星期六"),
SUNDAY(7, "星期日");
private Integer code;
private String des;
Week(Integer code, String des) {
this.code = code;
this.des = des;
}
public Integer getCode() {
return code;
}
public String getDes() {
return des;
}
/**
* des: 获取code、des的映射关系
*
* @return Map<Integer, String>
*/
public static Map<Integer, String> getWeekMap() {
return Arrays.stream(Week.values()).collect(Collectors.toMap(Week::getCode, Week::getDes));
}
/**
* des: 根据code获取星期枚举类型
* @param code 星期编码
* @return Week
*/
public static Week getEnumByCode(Integer code) {
for (Week week : Week.values()) {
if (week.getCode().equals(code))
return week;
}
return null;
}
}
## 优点
1、作为输入保证类型安全(边界限制),输入仅有这几种枚举类型。
2、使用枚举类型使代码可读性更强、更易于维护。
## 缺点
3、但是作为返回值却不能保证在前后端分离、或者分布式一致性、做到同步升级(拓展性较差)。
4、在分布式系统中,选择在哪里维护这些枚举类型,如果选择封装到公用Jar包,那么当部分服务需要升级该枚举的时候是否会影响其它服务,或者需要多个版本的Jar包(需要视具体的情况而定)。
5、枚举类型中的值都是一个对象,相比使用整形、字符,占用的空间会更大。
## 解决方案
1、返回的枚举的类型如果仅需要映射关系、而不需要依托于前端的一些实现则可以由服务端返回映射关系。(C/S)(但是一般不会这么做,会多一次请求,还是由前后端分别维护,因为枚举的变动性一般很小,变动比较大的一般存储在数据库。)
2、当返回新增的枚举类型,则需要做相关的容错处理,根据不同的情况,可以采取忽略、或者报错。
【以上内容仅供参考】