EnumUtils:你的枚举“变形金刚“——让枚举操作不再手工作业

news2025/5/13 7:23:36

各位枚举操控师们好!今天要介绍的是Apache Commons Lang3中的EnumUtils工具类。这个工具就像枚举界的"瑞士军刀",能让你的枚举操作从石器时代直接跃迁到星际文明!

一、为什么需要EnumUtils?

手动操作枚举就像:

  • 从字符串转枚举?要写一长串valueOf()的try-catch
  • 想获取所有枚举值?每次都要调用values()并缓存
  • 枚举映射?自己维护静态Map吧…

而EnumUtils就是你的"枚举魔法书":

// 原始人写法
try {
    Color color = Color.valueOf("RED");
} catch (IllegalArgumentException e) {
    // 又双叒叕处理异常
}

// 魔法师写法
Color color = EnumUtils.getEnum(Color.class, "RED");

二、EnumUtils的"枚举奥术"

1. 安全枚举转换

// 忽略大小写获取枚举
DayOfWeek day = EnumUtils.getEnumIgnoreCase(DayOfWeek.class, "monday");

// 带默认值的获取
Status status = EnumUtils.getEnum(Status.class, "UNKNOWN", Status.DEFAULT);

// 验证枚举是否存在
boolean exists = EnumUtils.isValidEnum(Color.class, "BLUE");

2. 枚举集合操作

// 获取枚举列表(比values()更灵活)
List<Color> colors = EnumUtils.getEnumList(Color.class);

// 获取枚举Map(名字到枚举的映射)
Map<String, Color> colorMap = EnumUtils.getEnumMap(Color.class);

3. 枚举位运算(处理位掩码)

// 合并枚举值(用于权限等场景)
long combined = EnumUtils.generateBitVector(Permission.class, 
    Arrays.asList(Permission.READ, Permission.WRITE));

// 从位掩码解析枚举集合
Set<Permission> perms = EnumUtils.processBitVector(Permission.class, combined);

三、实战"枚举魔法"

1. REST API参数转换

@GetMapping("/products")
public List<Product> getProducts(
    @RequestParam String status) {
    
    ProductStatus productStatus = EnumUtils.getEnumIgnoreCase(
        ProductStatus.class, status, ProductStatus.ACTIVE);
    
    return productService.getByStatus(productStatus);
}

2. 动态枚举校验

public boolean isValidEnumValue(Class<? extends Enum<?>> enumClass, String value) {
    return EnumUtils.isValidEnum(enumClass, value);
}

3. 权限管理系统

// 设置权限
long userPermissions = EnumUtils.generateBitVector(Permission.class,
    Arrays.asList(Permission.READ, Permission.COMMENT));

// 检查权限
boolean canWrite = EnumUtils.processBitVector(Permission.class, userPermissions)
    .contains(Permission.WRITE);

四、EnumUtils的"魔法守则"

  1. 性能提示:getEnumMap()和getEnumList()会缓存结果
  2. null安全:所有方法都安全处理null输入
  3. 大小写敏感:默认区分大小写,可用getEnumIgnoreCase()
  4. 位运算限制:最多支持64个枚举值(long的位数限制)

五、与现代Java的"魔法对决"

// Java 8+ Stream方案
Optional<Color> colorOpt = Arrays.stream(Color.values())
    .filter(c -> c.name().equalsIgnoreCase(input))
    .findFirst();

// Java 16+的模式匹配
if (color instanceof Color c) {
    // 直接使用c
}

六、版本特性比较

特性EnumUtilsJava 8 Stream原生valueOf()
代码简洁度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
安全性内置null和异常处理需要额外处理需要try-catch
功能丰富度位运算、集合操作等基础转换仅基础转换

七、总结

EnumUtils就像是:

  • 枚举转换的"翻译官"🗣️
  • 枚举集合的"管理员"📋
  • 位运算的"魔法师"🧙
  • 枚举操作的"防弹衣"🛡️

记住枚举操作的终极奥义:“好的枚举工具能让你的代码像枚举一样优雅!”

附赠枚举操作速查表:

场景推荐方法示例
安全转换getEnum()getEnum(Color.class, "RED")
忽略大小写getEnumIgnoreCase()getEnumIgnoreCase(Day.class, "monday")
枚举列表getEnumList()getEnumList(Status.class)
位掩码生成generateBitVector()generateBitVector(Permission.class, perms)
枚举验证isValidEnum()isValidEnum(Size.class, "XL")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智启未来:新一代云MSP管理服务助力企业实现云成本管理和持续优化

在数字化转型浪潮下&#xff0c;企业纷纷寻求更高效、更经济的运营方式。随着云计算技术的深入应用&#xff0c;云成本优化已成为企业普遍关注的核心议题。 过去&#xff0c;传统云运维服务往往依赖于人力外包&#xff0c;缺乏系统性、规范性的管理&#xff0c;难以有效降低云…

window 显示驱动开发-将虚拟地址映射到内存段(二)

在将虚拟地址映射到段的一部分之前&#xff0c;视频内存管理器调用显示微型端口驱动程序的 DxgkDdiAcquireSwizzlingRange 函数&#xff0c;以便驱动程序可以设置用于访问可能重排的分配位的光圈。 驱动程序既不能将偏移量更改为访问分配的 PCI 光圈&#xff0c;也不能更改分配…

【文心智能体】使用文心一言来给智能体设计一段稳定调用工作流的提示词

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《文心智能体》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff0…

K8S中构建双架构镜像-从零到成功

背景介绍 公司一个客户的项目使用的全信创的环境&#xff0c;服务器采用arm64的机器&#xff0c;而我们的应用全部是amd64的&#xff0c;于是需要对现在公司流水线进行arm64版本的同步镜像生成。本文介绍从最开始到最终生成双架构的全部过程&#xff0c;以及其中使用的相关配置…

c语言第一个小游戏:贪吃蛇小游戏03

我们为贪吃蛇的节点设置为一个结构体&#xff0c;构成贪吃蛇的身子的话我们使用链表&#xff0c;链表的每一个节点是一个结构体 显示贪吃蛇身子的一个节点 我们这边node就表示一个蛇的身体 就是一小节 输出结果如下 显示贪吃蛇完整身子 效果如下 代码实现 这个hasSnakeNode(…

​​​​​​​大规模预训练范式(Large-scale Pre-training)

大规模预训练指在巨量无标注数据上&#xff0c;通过自监督学习训练大参数量的基础模型&#xff0c;使其具备通用的表征与推理能力。其重要作用如下&#xff1a; 一 跨任务泛化 单一模型可在微调后处理多种NLP&#xff08;自然语言处理&#xff09;、CV&#xff08;计算机视觉…

WPF之高级绑定技术

文章目录 引言多重绑定&#xff08;MultiBinding&#xff09;基本概念实现自定义IMultiValueConverterMultiBinding在XAML中的应用示例使用StringFormat简化MultiBinding 优先级绑定&#xff08;PriorityBinding&#xff09;基本概念PriorityBinding示例实现PriorityBinding的后…

调出事件查看器界面的4种方法

方法1. 方法2. 方法3. 方法4.

使用vite重构vue-cli的vue3项目

一、修改依赖 首先修改 package.json&#xff0c;修改启动方式与相应依赖 移除vue-cli并下载vite相关依赖&#xff0c;注意一些peerDependency如fast-glob需要手动下载 # 移除 vue-cli 相关依赖 npm remove vue/cli-plugin-babel vue/cli-plugin-eslint vue/cli-plugin-rout…

数据治理域——数据治理体系建设

摘要 本文主要介绍了数据治理系统的建设。数据治理对企业至关重要&#xff0c;其动因包括应对数据爆炸增长、提升内部管理效率、支撑复杂业务需求、加强风险防控与合规管理以及实现数字化转型战略。其核心目的是提升数据质量、统一数据标准、优化数据资产管理、支撑业务发展和…

onGAU:简化的生成式 AI UI界面,一个非常简单的 AI 图像生成器 UI 界面,使用 Dear PyGui 和 Diffusers 构建。

​一、软件介绍 文末提供程序和源码下载 onGAU&#xff1a;简化的生成式 AI UI界面开源程序&#xff0c;一个非常简单的 AI 图像生成器 UI 界面&#xff0c;使用 Dear PyGui 和 Diffusers 构建。 二、Installation 安装 文末下载后解压缩 Run install.py with python to setup…

【第52节】Windows编程必学之从零手写C++调试器下篇(仿ollydbg)

目录 一、引言 二、调试器核心功能设计与实现 三、断点功能 四、高级功能 五、附加功能 六、开发环境与实现概要 七、项目展示及完整代码参考 八、总结 一、引言 在软件开发领域&#xff0c;调试器是开发者不可或缺的工具。它不仅能帮助定位代码中的逻辑错误&#xff0…

uni-app学习笔记五--vue3插值表达式的使用

vue3快速上手导航&#xff1a;简介 | Vue.js 模板语法 插值表达式 最基本的数据绑定形式是文本插值&#xff0c;它使用的是“Mustache”语法 (即双大括号)&#xff1a; <span>Message: {{ msg }}</span> 双大括号标签会被替换为相应组件实例中 msg 属性的值。同…

C++类与对象(二):六个默认构造函数(一)

在学C语言时&#xff0c;实现栈和队列时容易忘记初始化和销毁&#xff0c;就会造成内存泄漏。而在C的类中我们忘记写初始化和销毁函数时&#xff0c;编译器会自动生成构造函数和析构函数&#xff0c;对应的初始化和在对象生命周期结束时清理资源。那是什么是默认构造函数呢&…

从逻辑学视角探索数学在数据科学中的系统应用:一个整合框架

声明&#xff1a;一家之言&#xff0c;看个乐子就行。 图表采用了两个维度组织知识结构&#xff1a; 垂直维度&#xff1a;从上到下展示了知识的抽象到具体的演进过程&#xff0c;分为四个主要层级&#xff1a; 逻辑学基础 - 包括数理逻辑框架和证明理论数学基础结构 - 涵盖…

Matplotlib 完全指南:从入门到精通

前言 Matplotlib 是 Python 中最基础、最强大的数据可视化库之一。无论你是数据分析师、数据科学家还是研究人员&#xff0c;掌握 Matplotlib 都是必不可少的技能。本文将带你从零开始学习 Matplotlib&#xff0c;帮助你掌握各种图表的绘制方法和高级技巧。 目录 Matplotli…

如何有效追踪需求的实现情况

有效追踪需求实现情况&#xff0c;需要清晰的需求定义、高效的需求跟踪工具、持续的沟通反馈机制&#xff0c;其中高效的需求跟踪工具尤为关键。 使用需求跟踪工具能确保需求实现进度可视化、提高团队协作效率&#xff0c;并帮助识别和管理潜在风险。例如&#xff0c;使用专业的…

自动驾驶技术栈——DoIP通信协议

一、DoIP协议简介 DoIP&#xff0c;英文全称是Diagnostic communication over Internet Protocol&#xff0c;是一种基于因特网的诊断通信协议。 DoIP协议基于TCP/IP等网络协议实现了车辆电子控制单元(ECU)与诊断应用程序之间的通信&#xff0c;常用于汽车行业的远程诊断、远…

C++ 与 Go、Rust、C#:基于实践场景的语言特性对比

目录 ​编辑 一、语法特性对比 1.1 变量声明与数据类型 1.2 函数与控制流 1.3 面向对象特性 二、性能表现对比​编辑 2.1 基准测试数据 在计算密集型任务&#xff08;如 10⁷ 次加法运算&#xff09;中&#xff1a; 在内存分配测试&#xff08;10⁵ 次对象创建&#xf…

如何更改默认字体:ONLYOFFICE 协作空间、桌面编辑器、文档测试示例

在处理办公文件时&#xff0c;字体对提升用户体验至关重要。本文将逐步指导您如何在 ONLYOFFICE 协作空间、桌面应用及文档测试示例中自定义默认字体&#xff0c;以满足个性化需求&#xff0c;更好地掌控文档样式。 关于 ONLYOFFICE ONLYOFFICE 是一个国际开源项目&#xff0c…