有一次工作中,要根據多個參數確定一個值(車輛事件),確定一個值需要的參數大部分的屬性名稱是相同的,少部分是獨有的,但是參數的值幾乎都是不同的;
因為參數太多,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>直接獲取枚舉,即獲得了對應的事件。
部分代碼如下
枚舉類:AlarmEventEnum.java
@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(){}