说明
本文只对策略枚举可以使用的场景进行说明,不做其他介绍。提供额外的实现思路。
数据状态映射
在开发过程中,难免会遇到与其他系统的对接,或者产品设计,或者其他种种原因导致 本身的枚举与其他枚举之间需要做一个映射,达到两个字段或者系统的同步,又方便维护一目了然。
例如:
如上,可以有三个枚举类
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;
}
}
}
运行结果
其他系统的状态为:待提交
当前系统排序状态为:待办
如此,完成用枚举达到数据状态映射的效果