Java枚举-通过值查找对应的枚举
2024-08-30 18:38:34
一、背景
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
最近工作中,对接了很多其他的系统,发现对接的同一个系统都有不同的环境(开发、测试、正式环境),并且每个环境的配置信息通常不会修改,所以发现用枚举 做配置项,使用起来比较简洁,不同的环境配置 只需多定义一个枚举值就搞定了。
其中使用枚举就会涉及到通过传入的值,返回对应的枚举。
二、通过一个值 ,查询返回对应的枚举(示例代码)
2.1、枚举类
@Getter
public enum CustomType {
TEST("test","测试","111"),
DEV("dev","开发","222");
String typeCode;
String typeName;
String orgId;
CustomType(String typeCode, String typeName, String orgId) {
this.typeCode = typeCode;
this.typeName = typeName;
this.orgId = orgId;
}
}
2.2、常用的枚举方法;values(), ordinal() 和 valueOf() 方法
enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口。
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:
- values() 返回枚举类中所有的值。
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- valueOf()方法返回指定字符串值的枚举常量。
传入值查询枚举,就是通过values()方法,返回所以枚举,再遍历全部枚举,只要传入的参数值 跟当前枚举的值跟相同,就返回当前枚举;
2.3、通过传入一个或者多个值,返回对应的枚举
public CustomType find(String typeCode){
for (CustomType value : CustomType.values()) {
if(typeCode.equals(value.getOrgId())){
return value;
}
}
//根据自身的业务 查不到可以返回null,或者抛出异常。
return null;
}
public CustomType find(String orgId,String typeCode){
if(orgId == null || typeCode == null){
return null;
}
for (CustomType value : CustomType.values()) {
if(orgId.equals(value.getOrgId()) &&
typeCode.equals(value.getTypeCode())){
return value;
}
}
//根据自身的业务 查不到可以返回null,或者抛出异常。
return null;
}
三、查找优化
每次通过values()方法遍历查找,时间复杂度是O(n),而通过HashMap查找,时间复杂度是O(1)。
虽说枚举的数量通常都不会很庞大,每次通过values()方法遍历查找速度也很快。用HashMap会多占用一点点内存,但是考虑到这一点内存能从时间复杂度是O(n)降到O(1),这种惠而不费的事,还是可以花时间去优化代码的。
private static Map<String,CustomType> orgCustomType = new HashMap<>();
static {
for (CustomType value : CustomType.values()) {
orgCustomType.put(value.getOrgId(),value);
}
}
public CustomType find(String orgId){
return orgCustomType.get(orgId);
}
最新文章
- 【JavaScript】js数组操作,由push到那么多
- 配置SSH框架的心得
- FOJProblem 2214 Knapsack problem(01背包+变性思维)
- React.js入门小案例
- git冲突的发生和解决/git workspace关于git的配置
- c++ Cout 输出格式
- NSDate 总结日期操作
- classic asp中使用ADODB.Command防止sql injection
- IOS 学习笔记(5) 控件 文本视图(UITextView)的使用方法
- JavaDoc的生成规则---ShinePans
- mpi中利用自定义归约操作实现merge
- mysql转ElasticSearch的案例分析
- Codeforces 626D Jerry&#39;s Protest(暴力枚举+概率)
- Java经典编程题50道之五
- gdb core 调试多线程
- SD: 关于价格过程的确定
- zjoi 小星星
- 前端框架之Vue(4)-Class与Style绑定
- 实现 AD 采样,使用 LCD1602 显示 AD 数值
- wordcloud+jieba
热门文章
- 【LeetCode】98. Validate Binary Search Tree 解题报告(Python & C++ & Java)
- 【LeetCode】375. Guess Number Higher or Lower II 解题报告(Python)
- TensorFlow.NET机器学习入门【4】采用神经网络处理分类问题
- 全网连夜修复的Log4j漏洞,如何做到一行代码都不改?
- Sufficient Statistic (充分统计量)
- CS5210完全替代AG6202|HDMI转VGA芯片+原理图|替代兼容AG6202
- <;数据结构>;XDOJ332.二叉排序树的判定
- Java初学者作业——实现控制台的猜数字游戏。游戏运行时产生一个1~100之间的随机数字
- Java初学者作业——简单程序根据用户输入的会员类型以及购物金额,判断是否能够享受活动优惠
- Java面向对象程序设计作业目录(作业笔记)