有一次工做中,要根據多個參數肯定一個值(車輛事件),肯定一個值須要的參數大部分的屬性名稱是相同的,少部分是獨有的,可是參數的值幾乎都是不一樣的;
由於參數太多,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(){}