拿到一个需求,简略说明一下这个需求:
有多个值,假设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版权协议,转载请附上原文出处链接和本声明。