武知行

代码优化

2026年03月08日0 条评论

代码优化

关于枚举+MAP简化if...else链

背景

业务上有三个标签体系:

  • 企业
  • 企业主
  • 员工

使用场景

  • 明确知道要操作哪个标签体系,枚举的典型用法

    例如:

    @AllArgsConstructor
    public enum TagSystemEnum {
    
        /**
         * 用户标签体系
         */
        EU_TAG_SYSTEM(1, "用户", "eu_ident_name", "eu_tag_name", "eu", "eu__", "eu_id", "eu_active_info"),
    
        /**
         * 企业标签体系
         */
        CUST_TAG_SYSTEM(2, "企业", "cust_ident_name", "cust_tag_name", "cust", "cust__", "cust_id", "cust_tag"),
    
        /**
         * 业务标签体系
         */
        STAFF_TAG_SYSTEM(3, "业务", "staff_ident_name", "staff_tag_name", "staff", "staff__", "staff_id", "staff_tag");
    
        @Getter
        private Integer id;
    
        /**
         * 对应的中文标识
         */
        @Getter
        private String chinesePrefix;
    
        /**
         * redis标识字段名对应关系
         */
        @Getter
        private String identCacheKey;
    
        /**
         * redis标签字段名对应关系
         */
        @Getter
        private String tagNameCacheKey;
    
        /**
         * 标签系统的标识
         */
        @Getter
        private String tagSysIdent;
    
        /**
         * 各标签体系对应前缀
         */
        @Getter
        private String tagSysPrefix;
    
        /**
         * 各标签体系对应主键
         */
        @Getter
        private String tagSysPrimaryKey;
    
        /**
         * 各标签体系对应的ES的索引库名
         */
        @Getter
        private String tagESIndexName;
    }
    
    
  • 每个体系都要处理一系列固定方法,里面用到了这个体系的多个参数,多个体系就要重复执行这个方法多次,进行抽取的话涉及到的属性太多

  • 根据标签体系的id取对应的属性

    这个需求非常常见

  • 根据标签的标识 (ident) 取标签体系的id

    • 由于不存在ident => Enum那么我们首先可以采用if...else

      if (TagSystemEnum.CUST_TAG_SYSTEM.getTagSysIdent().equals(tagPrefix)) {
        tagSysId = TagSystemEnum.CUST_TAG_SYSTEM.getId();
      } else if (TagSystemEnum.EU_TAG_SYSTEM.getTagSysIdent().equals(tagPrefix)) {
        tagSysId = TagSystemEnum.EU_TAG_SYSTEM.getId();
      } else {
        tagSysId = TagSystemEnum.STAFF_TAG_SYSTEM.getId();
      }
      
    • 可以使用Map简化上述if...else,key为ident,value为id,接下来通过map.get(key)即可获取id

    • 可以在Enum中定义如下Map,key为ident,value为Enum

      public static final Map<String, TagSystemEnum> TAG_SYSTEM_IDENT_MAP = Stream.of(
        TagSystemEnum.values())
        .collect(Collectors.toMap(TagSystemEnum::getTagSysIdent, item -> item));
      

      这样以后我们就可以使用该Map通过ident取到对应体系的任何属性了,上面的if...else即可转换为:

      Integer tagSysId = TagSystemEnum.TAG_SYSTEM_IDENT_MAP.get(tagPrefix).getId();
      

字符串如果为null就转换为空字符串

Optional.ofNullable(tagFilterItemDO.getAppendGroupOperator()).orElse("")
/**
 * 标签体系与MaxCompute数仓表名映射
 */
private static final Map<Integer, Tuple> TAG_SYSTEM_TO_WAREHOUSE_TABLE_MAX_COMPUTE = ImmutableMap.<Integer, Tuple>builder()
        .put(TagSystemEnum.EU_TAG_SYSTEM.getId(), Pair.with("", "eu_id"))
        .put(TagSystemEnum.CUST_TAG_SYSTEM.getId(), Pair.with("", "cust_id"))
        .put(TagSystemEnum.STAFF_TAG_SYSTEM.getId(), Pair.with("", "staff_id"))
        .build();

评论 (0)

登录后即可发表评论

暂无评论,来发表第一条评论吧!