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

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

最新文章

  1. iOS开发小技巧 - label中的文字添加点击事件
  2. centos 7.0安装花生壳
  3. csu 1804 有向无环图
  4. HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)
  5. Windows Live Writer配置
  6. Google搜索的常用技巧
  7. yum和rpm命令详解
  8. Subway POJ 2502
  9. 转:你真的懂得JS吗?
  10. spring框架的一些技术总结
  11. 3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil)
  12. LintCode翻转字符串问题 - python实现
  13. PairProject——结对编程
  14. 矩形覆盖(python)
  15. VS2010与VS2013中的多字节编码与Unicode编码问题
  16. SqlServer 使用sys.dm_tran_locks处理死锁问题
  17. .NET:自定义配置节
  18. artTemplate 原生 js 模板语法版
  19. VSCode开发(一)——入门基础
  20. python socket编程入门级

热门文章

  1. CentOS 6和CentOS 7的系统服务管理
  2. 【GStreamer开发】GStreamer基础教程13——播放速度
  3. luffy项目搭建流程(Django前后端分离项目范本)
  4. 探索安卓热修复框架AndFix的奥秘
  5. 031 Android 自定义控件
  6. hugepage设置
  7. PAT(B) 1081 检查密码(Java)
  8. 腾讯云开发微信小程序使用体验
  9. IDEA使用技巧--将本地项目和git远程项目关联
  10. WebApi 身份认 Basic基础认证