多个key匹配同一个值(使用枚举)

拿到一个需求,简略说明一下这个需求:

有多个值,假设100个,其中10个对应的是红色,有20个对应的是绿色……

本来这些可以写到配置文件中的,但是在各方面情况考虑下,最终选择用枚举来实现;但是在使用枚举实现的过程中,遇到了一个问题。

通常使用枚举的时候,一般只有一个code,一个remark;通过如下代码展现一下


/**
 * Description:
 *
 * @author Liang_yj []
 * @version V1.1
 * @date 2021/12/3 15:15
 */
public enum LoginTypeEnum {

    WX_APP("WX_APP", "微信绑定"),
    WX_LOGIN("WX_LOGIN", "微信app登陆"),
    WX_MIN_PROGRAM_LOGIN("WX_MIN_PROGRAM_LOGIN", "微信小程序登录"),
    WX_SERVICE_LOGIN("WX_SERVICE_LOGIN", "微信公众号登录"),
    QUICK_LOGIN("QUICK_LOGIN", "快捷登陆"),
    PASSWROD_LOGIN("PASSWROD_LOGIN", "密码登陆"),
    REGIST("REGIST", "注册"),
    WECHAT_REGIST("WECHAT_REGIST", "微信注册绑定"),


    PLUS_PASSWROD_LOGIN("PLUS_PASSWROD_LOGIN", "密码登陆"),
    PLUS_QUICK_LOGIN("PLUS_QUICK_LOGIN", "快捷登陆"),
    WECHAT_LOGIN("WECHAT_LOGIN", "微信登录"),
    PHONE_LOGIN("PHONE_LOGIN", "一键登录"),


    UN_KNOWN("UN_KNOWN", "未知");

    private final String remark;

    private final String code;

    LoginTypeEnum(String code, String remark) {
        this.remark = remark;
        this.code = code;
    }

    public String getRemark() {
        return remark;
    }

    public String getCode() {
        return code;
    }

    public static LoginTypeEnum codeOf(String code) {
        for (LoginTypeEnum state : values()) {
            if (state.getCode().equals(code)) {
                return state;
            }
        }
        return null;
    }

}

每个枚举都只有一个code和一个remark,这样可以使用以上的构造方法以及codeOf方法通过code去拿取到当前的枚举,这样写起来很方便,并且在代码中使用良好的枚举提升代码可读性、复用性。

但是这次拿到的需求,是多个code对应一个remark,并且多个code的数量不是相同的,这就导致了构造方法去实现code和remark不理想(可以用枚举中最多的code的数量作为构造函数中参数的数量,但是这样写的代码,看上去就不太好);

最终我是这样写的:

/**
 * Description:
 *
 * @author Liang_yj []
 * @version V1.1
 * @date 2021/12/3 15:15
 */
public enum CardBackgroundColorEnum {
    RED("0321", "0413", "0417", "0424", "0461", "1", "102", "104", "1418", "302", "304", "306", "308", "313", "314", "316", "319", "320", "401", "501", "502", "503", "504", "505", "506", "509", "510", "532", "561", "562", "565", "621", "622", "623", "6302", "6304", "6403", "6413", "691", "711", "714", "715", "761", "775", "785", "786", "901"),
    YELLOW("0479", "0610", "201", "2509", "303", "307", "315", "610", "662", "713", "787"),
    BLUE("0301", "0319", "0401", "0414", "0423", "0434", "0507", "0508", "0521", "105", "202", "301", "305", "309", "310", "318", "321", "322", "531", "533", "564", "591", "593", "594", "595", "596", "641", "6423", "6501", "651", "752", "781"),
    GREEN("0441", "103", "203", "317", "402", "403", "563", "6100", "6441", "661", "671", "692", "694", "782"),
    NAVY_BLUE("712","741"),
    PURPLE("6303");

    private static final Map<String, String> map;

    static {
        map = new HashMap<>(CardBackgroundColorEnum.values().length);
        for (CardBackgroundColorEnum colorEnum : CardBackgroundColorEnum.values()){
            colorEnum.value.forEach(val->{
                if(CardBackgroundColorEnum.RED.equals(colorEnum)){
                    map.put((String) val, "https://RED…………");
                    return;
                }
                if(CardBackgroundColorEnum.YELLOW.equals(colorEnum)){
                    map.put((String) val, "https://YELLOW…………");
                    return;
                }
                if(CardBackgroundColorEnum.BLUE.equals(colorEnum)){
                    map.put((String) val, "https://BLUE…………");
                    return;
                }
                if(CardBackgroundColorEnum.GREEN.equals(colorEnum)){
                    map.put((String) val, "https://GREEN…………");
                    return;
                }
                if(CardBackgroundColorEnum.NAVY_BLUE.equals(colorEnum)){
                    map.put((String) val, "https://NAVY_BLUE…………");
                    return;
                }
                if(CardBackgroundColorEnum.PURPLE.equals(colorEnum)){
                    map.put((String) val, "https://PURPLE…………");
                    return;
                }
            });
        }
    }

    private final List value;

    CardBackgroundColorEnum(String ...value){
        this.value = Arrays.asList(value);
    }

    public List getValues(){
        return value;
    }

    public static String toUrl(String val){
        String url = map.get(val);
        if (null == url){
            return "https://default…………";
        }
        return url;
    }
}

首先是枚举中存放的值,存放的的是不等的List,再定义静态的final类型的map,在static代码块中为这个map进行赋值;通过foreach遍历枚举中的List,根据当前code对应的枚举去给map赋不同的Url。之后便可以使用toUrl方法,通过传进来的code去直接输出当前code所对应的值。


版权声明:本文为ONLYu_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。