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

因为参数太多,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. logstash kafka output 日志处理

    今天在用logstash解析日志并传送给kafka的时候,发现kafka能收到数据但数据内容已经丢失,具体如下: 在logstash output中增加输出样式之后,问题解决kafka再次接受到的内容 ...

  2. 【GStreamer开发】GStreamer基础教程16——平台相关的element

    目标 虽然GStreamer是跨平台的framework,但不是所有的element都是在所有平台下都有的.比如,音频和视频的sink都非常依赖于当前的window系统,根据当前的平台需要选择不同的e ...

  3. php有关类和对象的相关知识1

    有关类和对象的相关知识 类的自动加载 类的自动加载是指,在外面的页面中,并不需要去“引入”(包含)类文件,但是程序会在需要一个类的时候就自动去“动态加载”该类. 什么叫做“需要一个类”?通常是这样的情 ...

  4. 虚拟机中Linux环境下使用Squid部署代理缓存服务(及透明传输)

    小知识: 正确的使用Squid服务程序部署代理缓存服务可以有效提升访问静态资源的效率,降低原服务器的负载. 不仅如此,还为读者们添加了对指定IP地址.网页关键词.网址与文件后缀的ACL访问限制功能的实 ...

  5. art-template 弹出上传多图

    主内容 <script id="img-show-tpl" type="text/html"> <div> <div class= ...

  6. Nginx 系列教程

    Nginx(一):Nginx介绍 Nginx(二):编译安装Nginx及参数说明 Nginx(三):nginx.conf配置文件说明 [1] 配置参数说明 Nginx(三):nginx.conf配置文 ...

  7. 题解 CF1216A 【Prefixes】

    题目大意:给你一个长度为$n$($n$为偶数)的字符串,且这个字符串仅由$'a'$与$'b'$两种字符组成,要你用最少的操作次数使得 $s[i]!=s[i-1] (i/2=0,1≤i≤n)$(若字符串 ...

  8. C++ 中三种继承方式的理解

    一.公有继承(public inheritance) 1.概念:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可以直接访问. 实验一下:   我们用代 ...

  9. Java两整数相除保留两位小数

    int num1 = 7; int num2 = 9; // 创建一个数值格式化对象 NumberFormat numberFormat = NumberFormat.getInstance(); / ...

  10. Linux基础-07-系统的初始化和服务

    1. Linux系统引导的顺序 1) Linux系统引导的顺序:                             其中,BIOS的工作是检查计算机的硬件设备,如CPU.内存和风扇速度等: MB ...