枚举类使用情况
当我们要完成一个描述的转换,比如当我们要把一个种类用code值表示的时候
传统情况我们要使用条件判断,判断它为哪一种情况,然后给它的字段进行set赋值
这样对于代码的书写很麻烦,这个时候我们就可以通过使用枚举类,来帮我们简化我们的代码
遇到的场景
读取excel表格中的每一行数据,有一个字段为节点种类,有工作节点、管理节点、空节点..几个。
存入数据库后,为了方便之后的统计和遵循规范,需要根据节点种类来新增一个字段为nodeTypeCode
一般境况下
/**
* 实现invoke方法 , 此方法是一行一行的读取表中的内容
*
* @param nodeInfoBO 将每一行数据转化为对象
* @param analysisContext 上下文内容
*/
@Override
public void invoke(NodeInfoBO nodeInfoBO, AnalysisContext analysisContext) {
NodeInfo nodeInfo = new NodeInfo();
System.out.println(nodeInfoBO.getUseCategory());
//1、类型转化
BeanUtils.copyProperties(nodeInfoBO, nodeInfo);
//2、属性赋值
if(nodeInfo.getNodeType.equals("工作节点")){
nodeInfo.setNodeTypeCode(1);
}else if (nodeInfo.getNodeType.equals("管理节点")){
nodeInfo.setNodeTypeCode(2);
}
...
...
nodeInfoList.add(nodeInfo);
}
这样的话我们有几种情况,就会写多少判断语句,这样很麻烦,而且对于节点code值的管理也很不方便。
这时,我们就可以通过枚举类的方法进行简化
枚举类的使用
首先我们先创建一个枚举类
/**
* 节点类型
*
* @author wy
*/
public enum NodeTypeEnum {
MASTER(1, "管理节点"),
WORK(2, "工作节点"),
//空值
NULL(-1, "null");
//code值
private Integer code;
//对这个code值的描述,也就是nodeType
private String desc;
/**
* 将节点类型枚举类转为map, key为desc字段,例如:"管理节点"
*/
private static final Map<String, NodeTypeEnum> NODE_TYPE_ENUM_MAP = new ConcurrentHashMap<>();
static {
NODE_TYPE_ENUM_MAP.putAll(Arrays.stream(NodeTypeEnum.values())
.collect(Collectors.toMap(NodeTypeEnum::getDesc, nodeTypeEnum -> nodeTypeEnum)));
}
NodeTypeEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static NodeTypeEnum getByDesc(String desc) {
if (StringUtils.isEmpty(desc)) {
return NodeTypeEnum.WORK;
}
//这里getOrDefault时map自带的方法
//如果通过desc没有找到对应的枚举类,则会使用默认的枚举类
return NODE_TYPE_ENUM_MAP.getOrDefault(desc, NodeTypeEnum.WORK);
}
}
创建好枚举类之后,我们对之前的代码进行改进就变得特别的简洁
使用后的代码
@Override
public void invoke(NodeInfoBO nodeInfoBO, AnalysisContext analysisContext) {
NodeInfo nodeInfo = new NodeInfo();
System.out.println(nodeInfoBO.getUseCategory());
//1、类型转化
BeanUtils.copyProperties(nodeInfoBO, nodeInfo);
//2、属性赋值
nodeInfo.setNodeTypeCode(NodeTypeEnum.getByDesc(nodeInfo.getNodeType()).getCode());
nodeInfoList.add(nodeInfo);
}