策略枚举的用法二:数据状态映射

531 阅读4分钟

说明

本文只对策略枚举可以使用的场景进行说明,不做其他介绍。提供额外的实现思路。

数据状态映射

在开发过程中,难免会遇到与其他系统的对接,或者产品设计,或者其他种种原因导致 本身的枚举与其他枚举之间需要做一个映射,达到两个字段或者系统的同步,又方便维护一目了然。 例如: 在这里插入图片描述 如上,可以有三个枚举类

package com.strategy.btwo.enums;

/**
 * 当前系统单据状态
 */
public enum CurrentStatusEnum {

    /** 已提报 */
    HAD_CREATE(1, "已新建") {},

    /** 已提报 */
    HAD_SUBMIT(2, "已提报") {},

    /** 已审核" */
    HAD_AUDIT(3, "已审核") {},

    /** 已退回 */
    HAD_BACK(4, "已退回") {},

    /** 已拒绝 */
    HAD_REJECT(5, "已拒绝") {},

    /** 已使用 */
    HAD_USE(6, "已使用") {},

    /** 已关闭 */
    HAD_CLOSE(7, "已关闭") {};
    
    /** 枚举值 */
    private int index;

    /** 枚举描述 */
    private String name;

    CurrentStatusEnum(int index, String name) {
        this.index = index;
        this.name = name;
    }

    public int getIndex() {
        return index;
    }

    public String getName() {
        return name;
    }
}
package com.strategy.btwo.enums;

/**
 * 其它系统单据状态
 */
public enum OtherStatusEnum {

    /** 待提交 */
    HAD_CREATE(0, "待提交") {},

    /** 待审核 */
    HAD_SUBMIT(1, "待审核") {},

    /** 审核通过" */
    HAD_AUDIT(2, "审核通过") {},

    /** 审核退回 */
    HAD_BACK(4, "审核退回") {},

    /** 审核拒绝 */
    HAD_REJECT(5, "审核拒绝") {},

    /** 已使用 */
    HAD_USE(8, "已使用") {},

    /** 已关闭 */
    HAD_CLOSE(9, "已关闭") {};

    /** 枚举值 */
    private int index;

    /** 枚举描述 */
    private String name;

    OtherStatusEnum(int index, String name) {
        this.index = index;
        this.name = name;
    }

    public int getIndex() {
        return index;
    }

    public String getName() {
        return name;
    }
}
package com.strategy.btwo.enums;

/**
 * 当前系统单据状态排序
 */
public enum CurrentStatusOrderEnum {

    /** 1-已新建/已退回(待办) */
    ONE(1, "待办"),
    /** 2-其他状态(已办) */
    TWO(2, "已办");

    /** 枚举值 */
    private int index;

    /** 枚举描述 */
    private String name;

    CurrentStatusOrderEnum(int index, String name) {
        this.index = index;
        this.name = name;
    }

    public int getIndex() {
        return index;
    }

    public String getName() {
        return name;
    }
}

之后使用策略枚举进行数据映射 在 CurrentStatusEnum 添加 映射方法 getOtherStatusEnum() 和 getCurrentStatusOrderEnum()

package com.strategy.btwo.enums;

/**
 * 当前系统单据状态
 */
public enum CurrentStatusEnum {

    /** 已提报 */
    HAD_CREATE(1, "已新建") {
        @Override
        public OtherStatusEnum getOtherStatusEnum() {
            return OtherStatusEnum.HAD_CREATE;
        }
        @Override
        public CurrentStatusOrderEnum getCurrentStatusOrderEnum() {
            return CurrentStatusOrderEnum.ONE;
        }
    },

    /** 已提报 */
    HAD_SUBMIT(2, "已提报") {
        @Override
        public OtherStatusEnum getOtherStatusEnum() {
            return OtherStatusEnum.HAD_SUBMIT;
        }
        @Override
        public CurrentStatusOrderEnum getCurrentStatusOrderEnum() {
            return CurrentStatusOrderEnum.TWO;
        }
    },

    /** 已审核" */
    HAD_AUDIT(3, "已审核") {
        @Override
        public OtherStatusEnum getOtherStatusEnum() {
            return OtherStatusEnum.HAD_AUDIT;
        }
        @Override
        public CurrentStatusOrderEnum getCurrentStatusOrderEnum() {
            return CurrentStatusOrderEnum.TWO;
        }
    },

    /** 已退回 */
    HAD_BACK(4, "已退回") {
        @Override
        public OtherStatusEnum getOtherStatusEnum() {
            return OtherStatusEnum.HAD_BACK;
        }
        @Override
        public CurrentStatusOrderEnum getCurrentStatusOrderEnum() {
            return CurrentStatusOrderEnum.ONE;
        }
    },

    /** 已拒绝 */
    HAD_REJECT(5, "已拒绝") {
        @Override
        public OtherStatusEnum getOtherStatusEnum() {
            return OtherStatusEnum.HAD_REJECT;
        }
        @Override
        public CurrentStatusOrderEnum getCurrentStatusOrderEnum() {
            return CurrentStatusOrderEnum.TWO;
        }
    },

    /** 已使用 */
    HAD_USE(6, "已使用") {
        @Override
        public OtherStatusEnum getOtherStatusEnum() {
            return OtherStatusEnum.HAD_USE;
        }
        @Override
        public CurrentStatusOrderEnum getCurrentStatusOrderEnum() {
            return CurrentStatusOrderEnum.TWO;
        }
    },

    /** 已关闭 */
    HAD_CLOSE(7, "已关闭") {
        @Override
        public OtherStatusEnum getOtherStatusEnum() {
            return OtherStatusEnum.HAD_CLOSE;
        }
        @Override
        public CurrentStatusOrderEnum getCurrentStatusOrderEnum() {
            return CurrentStatusOrderEnum.TWO;
        }
    };

    /** 获取其他系统 */
    public OtherStatusEnum getOtherStatusEnum() {
        throw new RuntimeException("当前状态【" + this.getName() + "】没有对应的其他系统状态");
    }

    /** 获取排序状态 */
    public abstract CurrentStatusOrderEnum getCurrentStatusOrderEnum();

    public static CurrentStatusEnum valueOf(Integer index) {
        if (index == null) {
            return null;
        }
        for (CurrentStatusEnum modeEnum : CurrentStatusEnum.values()) {
            if (index == modeEnum.getIndex()) {
                return modeEnum;
            }
        }
        return null;
    }

    /** 枚举值 */
    private int index;

    /** 枚举描述 */
    private String name;

    CurrentStatusEnum(int index, String name) {
        this.index = index;
        this.name = name;
    }

    public int getIndex() {
        return index;
    }

    public String getName() {
        return name;
    }
}

在 OtherStatusEnum添加 映射方法 getOtherStatusEnum()

package com.strategy.btwo.enums;

/**
 * 其它系统单据状态
 */
public enum OtherStatusEnum {

    /** 待提交 */
    HAD_CREATE(0, "待提交") {
        @Override
        public CurrentStatusEnum getCurrentStatusEnum() {
            return CurrentStatusEnum.HAD_CREATE;
        }
    },

    /** 待审核 */
    HAD_SUBMIT(1, "待审核") {
        @Override
        public CurrentStatusEnum getCurrentStatusEnum() {
            return CurrentStatusEnum.HAD_SUBMIT;
        }
    },

    /** 审核通过" */
    HAD_AUDIT(2, "审核通过") {
        @Override
        public CurrentStatusEnum getCurrentStatusEnum() {
            return CurrentStatusEnum.HAD_AUDIT;
        }
    },

    /** 审核退回 */
    HAD_BACK(4, "审核退回") {
        @Override
        public CurrentStatusEnum getCurrentStatusEnum() {
            return CurrentStatusEnum.HAD_BACK;
        }
    },

    /** 审核拒绝 */
    HAD_REJECT(5, "审核拒绝") {
        @Override
        public CurrentStatusEnum getCurrentStatusEnum() {
            return CurrentStatusEnum.HAD_REJECT;
        }
    },

    /** 已使用 */
    HAD_USE(8, "已使用") {
        @Override
        public CurrentStatusEnum getCurrentStatusEnum() {
            return CurrentStatusEnum.HAD_USE;
        }
    },

    /** 已关闭 */
    HAD_CLOSE(9, "已关闭") {
        @Override
        public CurrentStatusEnum getCurrentStatusEnum() {
            return CurrentStatusEnum.HAD_CLOSE;
        }
    };

    /** 获取当前系统 */
    public CurrentStatusEnum getCurrentStatusEnum() {
        throw new RuntimeException("当前状态【" + this.getName() + "】没有对应的当前系统状态");
    }

    public static OtherStatusEnum valueOf(Integer index) {
        if (index == null) {
            return null;
        }
        for (OtherStatusEnum modeEnum : OtherStatusEnum.values()) {
            if (index == modeEnum.getIndex()) {
                return modeEnum;
            }
        }
        return null;
    }

    /** 枚举值 */
    private int index;

    /** 枚举描述 */
    private String name;

    OtherStatusEnum(int index, String name) {
        this.index = index;
        this.name = name;
    }

    public int getIndex() {
        return index;
    }

    public String getName() {
        return name;
    }
}

编写测试类

package com.strategy.btwo.enums;

import java.util.ArrayList;
import java.util.List;

/**
 * 单据状态 映射 测试类
 */
public class CurrentStatusEnumMainTest {

    public static void main(String[] args) {
        new CurrentStatusEnumMainTest().test();
    }

    private void test() {
        // 假设从数据库中获取了改数据的状态
        List<StatusEnumTest> list = getInitList();
        // 获取已新建的数据
        StatusEnumTest statusEnumTest = getStatusEnumTest(1L, list);
        // 获取对应其他系统状态
        OtherStatusEnum otherStatusEnum = CurrentStatusEnum.valueOf(statusEnumTest.getStatus()).getOtherStatusEnum();
        System.out.println("其他系统的状态为:" + otherStatusEnum.getName());
        // 获取排序状态
        CurrentStatusOrderEnum currentStatusOrderEnum = CurrentStatusEnum.valueOf(statusEnumTest.getStatus()).getCurrentStatusOrderEnum();
        System.out.println("当前系统排序状态为:" + currentStatusOrderEnum.getName());
    }

    private StatusEnumTest getStatusEnumTest(Long id, List<StatusEnumTest> list) {
        for (StatusEnumTest data : list) {
            if (id.equals(data.getId())) {
                return data;
            }
        }
        return null;
    }

    private List<StatusEnumTest> getInitList() {
        List<StatusEnumTest> list = new ArrayList<StatusEnumTest>();
        list.add(new StatusEnumTest(1L, 1, "这是已新建数据"));
        list.add(new StatusEnumTest(2L, 2, "这是已提报数据"));
        list.add(new StatusEnumTest(3L, 3, "这是已审核数据"));
        list.add(new StatusEnumTest(4L, 4, "这是已退回数据"));
        list.add(new StatusEnumTest(5L, 5, "这是已拒绝数据"));
        list.add(new StatusEnumTest(6L, 6, "这是已使用数据"));
        list.add(new StatusEnumTest(7L, 7, "这是已关闭数据"));
        return list;
    }

    private class StatusEnumTest {
        private Long id;
        private Integer status;
        private String other;

        public StatusEnumTest(Long id, Integer status, String other) {
            this.id = id;
            this.status = status;
            this.other = other;
        }

        public Long getId() {
            return id;
        }

        public Integer getStatus() {
            return status;
        }

        public void setStatus(Integer status) {
            this.status = status;
        }

        public String getOther() {
            return other;
        }

    }
}

运行结果

其他系统的状态为:待提交
当前系统排序状态为:待办

如此,完成用枚举达到数据状态映射的效果