如:
有一个枚举类,TYPE1 (1, "类型1"), TYPE2 (2, "类型2")
业务代码中需要用到这个枚举字段进行逻辑判断:
if (businValue == TYPE2) { ...... }
现在需求变更了,要将类型2的枚举值改成3了,字典表虽然一改就行,但业务判断的地方也要修改源代码。
有人有这方面的经验否?
是否参与了业务逻辑的枚举就不配用字典配置 -_- ?值只能写死在枚举里?
题主自己琢磨出来了,应该能用:
/**
* 字典枚举需要实现的接口
*/
public interface DictEnum {
/** 获取枚举值 */
int getValue();
/** 获取枚举文字描述 */
String getName();
/** 获取字典类型编码 */
String getDictType();
/** 获取字典编码 */
String getDictCode();
}
/**
* 枚举值缓存工具类
*/
public class EnumCacheUtil {
/** 字典缓存。实际可以用redis或Hutool提供的CacheUtil来存储。 */
private static final Map<String, Map<String, Object>> TEMP = new HashMap<>();
static {
// 模拟数据初始化
Map<String, Object> season = new HashMap<>();
season.put("spring_code", "春天");
season.put("spring_value", 1);
season.put("summer_code", "夏天");
season.put("summer_value", 2);
season.put("autumn_code", "秋天");
season.put("autumn_value", 3);
season.put("winter_code", "冬天");
season.put("winter_value", 4);
TEMP.put("season", season);
}
public int getValue(DictEnum e) {
Object val = TEMP.get(e.getDictType()).get(e.getDictCode() + "_value");
return Integer.parseInt(val.toString());
}
public String getName(DictEnum e) {
Object val = TEMP.get(e.getDictType()).get(e.getDictCode() + "_code");
return val.toString();
}
}
@AllArgsConstructor
public enum SeasonEnum implements DictEnum {
/***/
SPRING("spring"),
SUMMER("summer"),
AUTUMN("autumn"),
WINTER("winter");
private final String dictCode;
@Override
public int getValue() {
return new EnumCacheUtil().getValue(this);
}
@Override
public String getName() {
return new EnumCacheUtil().getName(this);
}
@Override
public String getDictType() {
return "season";
}
@Override
public String getDictCode() {
return dictCode;
}
}
public static void main(String[] args) {
// 字典值修改后,更新一下redis缓存,应用就能获取到最新的改动了,无需修改代码
String name = SeasonEnum.WINTER.getName();
int value = SeasonEnum.WINTER.getValue();
System.out.println(name);
System.out.println(value);
}
策略模式考虑一下,将不同的业务逻辑封装成不同的策略类
这个需求为什么会要求改枚举值,正常来说不应该去改,影响很大。
同一个业务场景,数据库或缓存或上下游通讯里面是否会导致同时存在两种枚举值?
新老版本并存期间,新版本代码还能加个判断兼容一下,跑老代码的服务器怎么办,会不会报错?
报表服务如果遇到了历史数据和新数据,能不能同时处理?
枚举有没有通过接口传播,上下游其他系统有没有影响?
开闭原则,枚举再加一个类型,老值在非必要情况下不建议去修改