本篇文章将介绍:
- 枚举类存在的意义
- 魔法值不能存在的原因
- 枚举类的设置
- 枚举类的使用注意事项
- 枚举类的存放位置
枚举类存在的意义就是防止程序中出现魔法值,魔法值就是一些写死的值举个例子:
user.setAge("23");
其中的23就是魔法值,
魔法值不能存在的原因:
魔法数值使代码的可读性大大下降
具体原因请查看:
https://blog.youkuaiyun.com/qq_39929929/article/details/82924887
下面说下枚举类的设置
枚举类中设置的String 类型的key和String 类型的value
也有的是设置的是String类型的name 和Integer类型的value
先说第一种设置
如果设置的枚举属性都是String类型,那么,可能数据库库中对应的存储字段是varchar类型
那么在设置的枚举类中key值就是要存储到数据库中的值,那么在写业务代码时要进行相应的转换
设置默认值的时候
po.setDataSource(ProductDataSourceEnum.MDM.getKey());
前端传相应的值时需要做转换
po.setDataSource(ProductDataSourceEnum.getNameByValue(query.getDataSource()));
存储到数据库中
value表示在前端页面上显示的值,它是对key值意义的描述,所以在向前端展示数据的时候对应的字段我们也要做相应的转换
vo.setDataSource(ProductDataSourceEnum.getValueByName(po.getDataSource));
第一种的枚举类 设置
package com.deepexi.product.enums.product;
import com.deepexi.product.enums.certificate.SignStatusEnum;
import org.apache.commons.lang.StringUtils;
import java.util.Objects;
/**
* @Author xiang
* @CreatTime 2020/6/24
* @Describe
*/
public enum ProductDataSourceEnum {
MDM("MDM","MDM下发");
public String key;
public String value;
ProductDataSourceEnum(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
/**
* 根据值返回名称
*/
public static String getNameByValue(String value) {
SignStatusEnum[] arr = SignStatusEnum.values();
for (SignStatusEnum e : arr) {
if (value.equals(e.getValue())) {
return e.getKey();
}
}
return "";
}
public static String getValueByName(String name) {
SignStatusEnum[] arr = SignStatusEnum.values();
for (SignStatusEnum e : arr) {
if (name.equals(e.getKey())) {
return e.getValue();
}
}
return null;
}
public static Boolean isHasValue(String value) {
if (Objects.isNull(value)) {
return false;
}
if (StringUtils.isBlank(getNameByValue(value))) {
return false;
}
return true;
}
public static Boolean isHasName(String name) {
if (StringUtils.isBlank(name)) {
return false;
}
if (Objects.isNull(getValueByName(name))) {
return false;
}
return true;
}
}
第二种枚举类设置
package com.deepexi.product.enums.product;
import org.apache.commons.lang.StringUtils;
import java.util.Objects;
public enum ValidEnum {
START("使用中", 1),
STOP("停用中", 0);
private String name;
private Integer value;
ValidEnum(String name, Integer value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public Integer getValue() {
return value;
}
/**
* 根据值返回名称
*/
public static String getNameByValue(Integer value) {
if (Objects.isNull(value)) {
return "";
}
ValidEnum[] arr = ValidEnum.values();
for (ValidEnum e : arr) {
if (value.equals(e.getValue())) {
return e.getName();
}
}
return "";
}
public static Integer getValueByName(String name) {
if (Objects.isNull(name)) {
return null;
}
ValidEnum[] arr = ValidEnum.values();
for (ValidEnum e : arr) {
if (name.equals(e.getName())) {
return e.getValue();
}
}
return null;
}
public static Boolean isHasValue(Integer value) {
if (Objects.isNull(value)) {
return false;
}
return StringUtils.isNotBlank(getNameByValue(value));
}
public static Boolean isHasName(String name) {
return StringUtils.isNotBlank(name) && !Objects.isNull(getValueByName(name));
}
}
针对这种设置就是数据库中对应的字段就是int/bigint/tinyint这些类型
value就是对应数据库中存储的字段,是将value的值存储到数据库中
name就是对value值的描述,是展示在前端页面的
存储到数据库中做的转换
前端传相应的值的时候做的转换
po.setValidLabel(ValidEnum.getValueByName(query.getValidLabel));
或者是设置默认值的时候
po.setValidLabel(ValidEnum.START.getValue());
同样 在向展示前端数据的时候做出相应的转换
vo.setValidLabel(ValidEnum.getNameByValue(po.getValidLabel));
如果枚举类中有字段是Integer类型的时候一般是从1开始递增,除非设置的枚举是描述yes,no或者是停止,开启这些设置时从0开始
枚举类存放的位置
一般项目都分为xxx-api,xxx-provider
枚举类一般都放在xxx-provider项目的指定位置,而api中的枚举则是专门对api接口提供的仅仅是接口而不是service层,也就是说只有api接口中需要用到转换时枚举类才放到api中.