有一次工作中,要根据多个参数确定一个值(车辆事件),确定一个值需要的参数大部分的属性名称是相同的,少部分是独有的,但是参数的值几乎都是不同的;

因为参数太多,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(){}

Java枚举的小例子的更多相关文章

  1. java即时通信小例子

    学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...

  2. Java处理文件小例子--获取全国所有城市的坐标

    需求:前端展示数据,全国城市的坐标

  3. 如何理解java枚举,看例子

    先来看一下不用枚举怎么表示常量: //常量类 class Num { public static String ONE = "ONE"; public static String ...

  4. Java枚举的小知识点

    enum 是jdk1.5引入的,使用它可以创建枚举类型,就像使用class创建类一样. enum关键字创建的枚举类型默认是java.lang.Enum(一个抽象类)的子类 用法1 常量 一般定义常量都 ...

  5. Thinking in java之正则表达式小例子

    public static final String POEM= "Twas brilling, and the slithy toves\n" + "Did gyre ...

  6. Java反射机制小例子

    package com.wjy.main; import java.io.Console; import java.lang.reflect.Constructor; import java.lang ...

  7. 验证java引用的小例子

    1. 声明一个变量person指向一个引用对象, 然后将这个person添加到集合list中, 然后将变量person指向null, 问:list中添加的person变成null了吗? import ...

  8. Java枚举的小用法

    package com.lxc.wmb; public enum TestEnum { Success("200","成功!"), Faild("50 ...

  9. 【JUC】CountDownLatch和Java枚举的使用例子

    public enum CountryEnum { ONE(1,"春"), TWO(2,"夏"), THREE(3,"秋"), FOUR(4 ...

随机推荐

  1. 提示不是内部或外部命令-Java的jdk、JRE包

    因为要测试后台程序的功能,所以要先安装Java的jdk包,配置环境变量. 首先要安装jdk和jre,才是完整的,只安装其中一个的话,在cmd命令行输入“JAVAC”会提示“不是内部或外部命令” 目前最 ...

  2. 常见问题:计算机网络/运输层/UDP

    几乎不对IP增加其他东西,无连接. 优势 速度快.适合实时. 无连接建立,没有连接时延. 无连接状态. 分组首部开销小.TCP需20字节,UDP仅需8字节. 使用UDP的协议 DNS SNMP RIP ...

  3. ubuntu 安装 iperf

    iperf的github https://github.com/esnet/iperf/releases 解压 sudo tar -zvxf iperf-3.6.tar.gz -C /usr/loca ...

  4. phaser三个学生做题目

    3个学生一起参加考试,一共有三道题,要求所有学生到齐才能开始考试,全部同学都做完第一题,学生才能继续做第二题,全部学生做完了第二题,才能做第三题,所有学生都做完的第三题,考试才结束 public cl ...

  5. 【转帖】docker 如何删除none镜像

    https://blog.csdn.net/hicoldcat/article/details/80802447 shell 命令博大精深 需要仔细学习 删除none的镜像,要先删除镜像中的容器.要删 ...

  6. 算法两数之和 python版

    方法一.暴力解法 -- 5s 复杂度分析:时间复杂度:O(n^2)空间复杂度:O(1) length = len(nums)for i in range(length):    for j in ra ...

  7. zabbix的离线安装方法----孙祎晨,如需转载请注明出处,谢谢配合。

    ------------------------zabbix的离线安装步骤--------------------------------------------------------------- ...

  8. create-react-app中的一些功能配置

    1. 根路径别名@ 1. npm run eject调出配置文件.找到webpack.config.js,搜索到,alias,在下面添加一行键值对'@':paths.appSrc, alias: { ...

  9. Linux下 sftp服务配置

    查看openssh的版本,使用ssh -V 命令来查看openssh的版本,版本必须大于4.8p1,低于的这个版本需要升级. 参考博客:https://yq.aliyun.com/articles/6 ...

  10. MacBook Pro 安装composer及Yii2.0

    最近想看看Yii的一些东西,需要安装一下composer curl -sS https://getcomposer.org/installer | php 此操作会下载最新版本到当前的目录下 然后将下 ...