java里参与了业务逻辑判断的枚举类有办法和字典表动态关联吗?


如:
有一个枚举类,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);  
  }

策略模式考虑一下,将不同的业务逻辑封装成不同的策略类

这个需求为什么会要求改枚举值,正常来说不应该去改,影响很大。
同一个业务场景,数据库或缓存或上下游通讯里面是否会导致同时存在两种枚举值?
新老版本并存期间,新版本代码还能加个判断兼容一下,跑老代码的服务器怎么办,会不会报错?
报表服务如果遇到了历史数据和新数据,能不能同时处理?
枚举有没有通过接口传播,上下游其他系统有没有影响?

开闭原则,枚举再加一个类型,老值在非必要情况下不建议去修改