@JunQiu
2019-11-22T03:24:40.000000Z
字数 1252
阅读 2414
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、当返回新增的枚举类型,则需要做相关的容错处理,根据不同的情况,可以采取忽略、或者报错。
【以上内容仅供参考】
