关系系统常量枚举获取controller接口优化

大部分系统很多时候需要定义很多系统常量,前端需要从后台获取,普通的方法是一个枚举写一个,对于大量枚举类类似这样

想到一个优化方法可以借鉴

定义枚举定义接口

public interface IConstant {

    Integer getValue();

    String getName();

    List<ValueName> valueNames();
}

枚举实现接口

import lombok.AllArgsConstructor;
import lombok.Data;


@Data
@AllArgsConstructor
public class ValueName {

    private int value;

    private String name;
}



import java.lang.annotation.*;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Constant {
    String value() default "";
}




import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;


@Constant("gender")
public enum GenderEnum implements IConstant {

    MALE(0, "男"),
    FEMALE(1, "女");

    private Integer value;
    private String name;

    GenderEnum(Integer value, String name) {
        this.value = value;
        this.name = name;
    }

  
 
    @Override
    public  List<ValueName> valueNames() {
        return Stream.of(values())
                .map(v -> new ValueName(v.getValue(), v.getName()))
                .collect(Collectors.toList());
    }

    @Override
    public Integer getValue() {
        return value;
    }

    @Override
    public String getName() {
        return name;
    }
}

 

获取枚举controller接口

    private static ConcurrentMap<String, List<ValueName>> CNT_CACHE = new ConcurrentHashMap<>();


    @GetMapping("/constant/value_list")
    @ApiOperation("查询系统枚举数据")
    public ApiResult findConstantValueList(@RequestParam String name) {
        return ApiResult.success(CNT_CACHE.get(name));
    }

    static {
        Set<String> keys = CNT_CACHE.keySet();
        if (keys.isEmpty()) {
            synchronized (CNT_CACHE) {
                if (keys.isEmpty()) {
                    Package pkg = GenderEnum.class.getPackage();
                    Reflections reflections = new Reflections(pkg.getName());
                    reflections.getTypesAnnotatedWith(Constant.class)
                            .forEach(clz -> {
                                try {
                                    if (clz.isEnum()) {
                                        Object[] objects = clz.getEnumConstants();
                                        Constant cEnum = clz.getAnnotation(Constant.class);
                                        IConstant constant = ((IConstant) objects[0]);
                                        CNT_CACHE.put(cEnum.value(), constant.valueNames());
                                    }
                                } catch (Exception e) {
                                    log.error("", e);
                                }
                            });
                }
            }
        }
    }

对这就是反射的魅力  可以减少很多代码

一个喜欢思考的少年

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值