Java枚舉的小例子

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