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

因为参数太多,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. ELK之7版本Elastic Maps功能介绍

    Elasticsearch 7.0 中还引入了一个新的聚合来处理地理地图图块,允许用户在地图上放大和缩小,而不会改变结果数据的形状,实现更加平滑地缩放 Elastic Maps:使用纳秒精度存储时序数 ...

  2. C++标准模板库STL算法与自适应容器(栈和队列)

    参考<21天学通C++>第23与第24章节,对STL算法与自适应容器进行介绍. 实际上在前面的STL顺序容器.关联容器进行介绍时或多或少引用到了一些STL算法中的模板函数.而自适应容器是在 ...

  3. 《Netty实战》源码运行及本地环境搭建

     1.源码路径: GitHub - zzzvvvxxxd/netty-in-action-cn: Netty In Action 中文版 ,中文唯一正版<Netty实战>的代码清单 下载后 ...

  4. jenkins最新版下载安装

    前提:安装配置 jetty 在线下载jetty# wget http://download.eclipse.org/jetty/8.1.17.v20150415/dist/jetty-distribu ...

  5. 洛谷 题解 UVA12661 【有趣的赛车比赛 Funny Car Racing】

    [题意] 在一个赛车比赛中,赛道有\(n(n<=300)\)个交叉点和\(m(m<=50000)\)条单向道路.有趣的是,每条道路都是周期性关闭的.每条道路用5个整数\(u,v,a,b,t ...

  6. todo---callback

    todo---callback https://blog.csdn.net/u010158267/article/details/51426963/

  7. java多线程中篇(一) —— Thread详情

    简介 简言之,现在的JDK线程模型基于操作系统原生线程,所以模型依赖于操作系统对线程的支持,另外Windows和Linux系统提供的线程模型就是一对一的 所以可以简单认为: 现在Java线程与操作系统 ...

  8. P5200 [USACO19JAN]Sleepy Cow Sorting

    P5200 [USACO19JAN]Sleepy Cow Sorting 题目描述 Farmer John正在尝试将他的N头奶牛(1≤N≤10^5),方便起见编号为1…N,在她们前往牧草地吃早餐之前排 ...

  9. 2019牛客暑期多校训练营(第四场)A meeting(dfs或dp,dp待更新)

    示例1: 输入: 4 21 23 13 42 4 输出:2 说明: They can meet at place 1 or 3. 题意:从K个点到达不联通图某个点需要的最短时间,这个最短时间是这K个人 ...

  10. 如何使用Cloud Foundry CLI把一个应用推送到MindSphere

    一.登录MindSphere - Cloud Foundry 1. 安装Cloud Foundry CLI (Command Line Interface). 下载地址:https://github. ...