java枚举类统一处理,翻译,并作为字典类提供查询

一.枚举类

@Getter
@AllArgsConstructor
@DictEnum(key = "gender", desc = "性别")
public enum GenderEnum implements IBaseEnum<Integer> {

    MAN(1, "男"),
    WOMAN(2, "女"),
    OTHERS(3, "其他");

    private Integer value;
    private String desc;
}

public interface IBaseEnum<T extends Serializable> extends IEnum<T>{

    /**
     * 获取枚举描述
     * @return 枚举描述
     */
    String getDesc();

}
public interface IEnum<T extends Serializable> {
    T getValue();
}

二.工具类

public class EnumUtils {

    /**
     * 根据枚举值获取枚举
     * @param baseEnumClass 枚举类
     * @param value 枚举值
     * @return 枚举
     */
    public static <T extends IBaseEnum<Integer>> T select(Class<T> baseEnumClass, Integer value) {
        if (Objects.isNull(value)) {
            return null;
        }
        return Stream.of(baseEnumClass.getEnumConstants()).filter(x -> x.getValue().equals(value)).findAny().orElse(null);
    }

    /**
     * 根据枚举值获取枚举描述
     * @param baseEnumClass 枚举类
     * @param value 枚举值
     * @return 枚举描述
     */
    public static <T extends IBaseEnum<Integer>> String getDescByKey(Class<T> baseEnumClass, Integer value) {
        return Optional.ofNullable(select(baseEnumClass, value)).map(IBaseEnum::getDesc).orElse(StringUtils.EMPTY);
    }

}

三.作为枚举翻译使用

    @ApiModelProperty("性别")
    private String genderDesc;

    public String getGenderDesc() {
        return EnumUtils.getDescByKey(GenderEnum.class, getGender());
    }

四.作为字典使用

1.字典类

  • 自定义注解,用于标记转换字典的枚举
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface DictEnum {
    /**
     * 字典标识
     */
    String key() default "";
    /**
     * 字典标识名称
     */
    String desc() default "";

}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "DictionaryManagement", description = "字典管理")
public class DictionaryManagement extends BaseEntity {

    @ApiModelProperty("名称")
    private String dictName;

    @ApiModelProperty("类型")
    private String dictType;

    @ApiModelProperty("是否系统变量")
    private Boolean sysDictFlag;

    @ApiModelProperty("状态 0.启用 1.禁用")
    private Integer status;

    @TableField(exist = false)
    private List<DictionaryData> ddList;

    @TableField(exist = false)
    @ApiModelProperty("是否枚举类")
    private Boolean enumFlag = Boolean.FALSE;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "DictionaryData", description = "字典数据")
public class DictionaryData extends BaseEntity {

    @ApiModelProperty("字典id")
    private Long dictMgtId;

    @ApiModelProperty("标签")
    private String dictTag;

    @ApiModelProperty("键值")
    private String dictValue;

    @ApiModelProperty("排序")
    private Integer orderNum;

    @ApiModelProperty("状态 0.启用 1.停用")
    private Integer status;

}

2.枚举初始化

  • CommonConstant.BASE_PACKAGE 为枚举包所在的位置,根据项目实际情况配置
@Component
public class DictEnumConfig implements InitializingBean {

    private static Map<String, DictionaryManagement> dmMap = new HashMap<>();

    public static Map<String, DictionaryManagement> getDmMap() {
        return dmMap;
    }

    private static void setDmMap(Map<String, DictionaryManagement> dmMap) {
        DictEnumConfig.dmMap = dmMap;
    }

    @Override
    public void afterPropertiesSet() {
        Reflections reflections = new Reflections(CommonConstant.BASE_PACKAGE);
        Set<Class<? extends IBaseEnum>> monitorClasses = reflections.getSubTypesOf(IBaseEnum.class);
        List<DictionaryManagement> dmList = new ArrayList<>();
        monitorClasses.forEach(m -> {
            if (m.isAnnotationPresent(DictEnum.class)) {
                DictEnum dictEnum = m.getAnnotation(DictEnum.class);
                DictionaryManagement dictionaryManagement = new DictionaryManagement();
                dictionaryManagement.setEnumFlag(Boolean.TRUE);
                dictionaryManagement.setDictType(dictEnum.key());
                dictionaryManagement.setDictName(dictEnum.desc());
                dictionaryManagement.setStatus(StatusEnum.ENABLE.getValue());
                dictionaryManagement.setSysDictFlag(Boolean.TRUE);

                List<DictionaryData> ddList = new ArrayList<>();
                DictionaryData dictionaryData;
                IBaseEnum[] enumConstants = m.getEnumConstants();
                for (IBaseEnum baseEnum : enumConstants) {
                    dictionaryData = new DictionaryData();
                    dictionaryData.setDictValue(baseEnum.getValue().toString());
                    dictionaryData.setDictTag(baseEnum.getDesc());
                    dictionaryData.setStatus(StatusEnum.ENABLE.getValue());
                    ddList.add(dictionaryData);
                }
                dictionaryManagement.setDdList(ddList);
                dmList.add(dictionaryManagement);
            }
        });
        setDmMap(dmList.stream().collect(Collectors.toMap(DictionaryManagement::getDictType, Function.identity())));
    }

}

3.调用方式

  • 此处优先枚举,后字典,也可采用先字典,后枚举,或者混合使用
	@ApiOperation(value = "根据多个字典类型查询字典数据")
    @GetMapping("/listAllDataByTypes")
    public List<DictionaryManagement> listAllDataByTypes(@RequestParam Set<String> dictTypeList) {
        List<DictionaryManagement> dmList = new ArrayList<>();
        Map<String, DictionaryManagement> dmMap = DictEnumConfig.getDmMap();
        Set<String> dictTypeListRemain = new HashSet<>();
        for (String dictType : dictTypeList) {
            if (dmMap.containsKey(dictType)){
                DictionaryManagement dictionaryManagement = dmMap.get(dictType);
                dmList.add(dictionaryManagement);
            }else {
                dictTypeListRemain.add(dictType);
            }
        }
        List<DictionaryManagement> dictionaryManagements = dictionaryManagementService.listAllDataByTypes(dictTypeListRemain);
        dmList.addAll(dictionaryManagements);
        return dmList;
    }
  • 以上仅供参考,有更好方式请留言指教
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值