有一次工做中,要根据多个参数肯定一个值(车辆事件),肯定一个值须要的参数大部分的属性名称是相同的,少部分是独有的,可是参数的值几乎都是不一样的;
由于参数太多,if-else写起来就太不优雅了,能够参考用工厂模式和策略模式优化过多的IF-ELSE:https://www.cnblogs.com/theRhyme/p/10339382.html;
这里就做为一个Java Eunm的例子;
也能够再数据库中配置一张表,对应的字段就是数据库表中对应的列,属性的值就是对应的行记录,判断是哪一种事件就能够用查询语句了:select desc from table_name where 查询条件;
为何不用重载?这里的重点不是接受不定参数,而是根据多个参数的值肯定另外一个惟一值;
给每个枚举设置一个key,key的值如${code}_${type}_${category}, key的规则就是:属性code的值_属性type的值_属性category的值,这样作的好处,解析请求体中的参数,拼接成key,从EnumMap<String,MyEnum>直接获取枚举,即得到了对应的事件。html
枚举类:AlarmEventEnum.javajava
@Slf4j public enum AlarmEventEnum { DRIVING_ZONE("driving_zone_route","{confuse_value}线路","{confuse_value} Route"), DRIVING_ZONE_CIRCLE("driving_zone_circle","{confuse_value}区域","{confuse_value} Zone"), BEHAVIOR_FATIGURE("behavior_fatigure","疲劳驾驶,已连续驾驶{value}小时","Fatigue Driving, Has Been Driving For {value} Hours"), BEHAVIOR_SEATBELT("behavior_seatbelt","未系安全带","Unfastened Seat Belt"), BEHAVIOR_BRAKE("behavior_brake","紧急刹车,刹车前时速{value}公里/时","Emergency Braking, Speed Before Braking {value} km/h"), ; /** * 加快事件获取 */ private String key; private String cnDesc; private String enDesc; public String getKey() { return key; } private AlarmEventEnum(String key, String cnDesc, String enDesc) { this.key = key; this.cnDesc = cnDesc; this.enDesc = enDesc; } /** * 国际化 * @param locale * @return */ public String getLocaleEventDesc(String locale){ if (EventEnumUtil.CN.equals(locale)){ return this.cnDesc; }else if (EventEnumUtil.EN.equals(locale)){ return this.enDesc; }else{ //国际化参数错误 log.error("Parameter 'locale' : {} is wrong!!! ",locale); return "Parameter 'locale' : "+ locale + " is wrong!!! "; } } //还有不少代码未展现出来,这里做为例子就足够了 }
对应该枚举的工具类:EventEnumUtil.java数据库
@Slf4j public class EventEnumUtil { /** * 国际化 */ public static final String CN = "CN"; public static final String EN = "EN"; /** * 须要判断的参数 */ public static final String LABELS_CODE = "code"; public static final String FIELDS_VALUE = "value"; public static final String FIELDS_TYPE = "type"; public static final String FIELDS_CATEGORY = "category"; private static Map<String,AlarmEventEnum> enumMap = new HashMap<>(); //这里初始化Map,Map的key就是枚举的key属性,值就是枚举自己,这样作的目的是为了根据key更快获取枚举的值。 static { AlarmEventEnum[] values = AlarmEventEnum.values(); for (int i=0; i<values.length; i++){ enumMap.put(values[i].getKey(),values[i]); } } /** * 根据这三个参数生成枚举对象AlarmEventEnum中的key * @param code * @param type * @param category * @return */ private static String generateAlarmEventEnumKey(String code, String type, String category) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(code); if (type != null) { stringBuilder.append("_"); stringBuilder.append(type); } if (category != null) { stringBuilder.append("_"); stringBuilder.append(category); } return stringBuilder.toString(); } //未展现所有代码,可是已经够了 private EventEnumUtil(){}