• 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>直接获取枚举,即获得了对应的事件。

    部分代码如下

    枚举类: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(){}
    
    
  • 相关阅读:
    wmq的A×B Problem
    MATLAB 求系统的单位冲击响应及单位阶跃响应
    关于共享率过低的一些事
    Vue组件之间的通信
    浏览器支持ES6的import和export
    Vue axios拦截问题
    开屏倒计时
    git常用操作
    原型
    this指向问题
  • 原文地址:https://www.cnblogs.com/theRhyme/p/9996966.html
Copyright © 2020-2023  润新知