枚举类的使用

枚举类使用情况

当我们要完成一个描述的转换,比如当我们要把一个种类用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);
    }

上一篇:对查询结果进行排序


下一篇:稀疏表示学习(二)-- 如何计算稀疏表示