Java 枚举类中怎么通过在枚举中编写静态 Map 缓存加速键值对的正反向解析

陌婷大大_4874

陌婷大大_4874

2026-07-29

197人浏览

原创

Java枚举应通过构造器向static final Map注册实现高效正反向查找,避免在static块中调用values()导致空指针;推荐配合Optional或默认值增强null安全性,整型key可选EnumMap优化性能。

java 枚举类中怎么通过在枚举中编写静态 map 缓存加速键值对的正反向解析

在 Java 枚举类中,用静态 Map 缓存实现正向(枚举值 → 字符串/数字)和反向(字符串/数字 → 枚举值)查找,能显著避免每次调用 values() 或遍历带来的性能开销。关键在于:静态 Map 只初始化一次,且必须在枚举实例全部声明完成后构建,否则会因初始化顺序问题导致空指针或不完整。

为什么不能在 static 块里直接遍历 values()?

枚举类的 values() 方法底层依赖由 JVM 自动生成的静态数组,该数组在所有枚举实例初始化完毕后才就位。若在 static 初始化块中过早调用 values()(比如在枚举常量定义中途),可能返回 null 或不全的数组 —— 这是常见陷阱。

  • 错误写法:在 static { ... } 块里直接调用 MyEnum.values()
  • 正确做法:利用枚举类构造器 + 静态 final Map + 延迟初始化(如使用 EnumMap 或在第一个访问时填充)

推荐方式:构造器注册 + 静态不可变 Map

每个枚举实例在创建时主动向静态 Map 注册自己,确保顺序安全、线程安全(枚举天生单例且类加载时初始化完成)。

public enum Status {
    SUCCESS(1, "成功"),
    FAILED(0, "失败"),
    PENDING(2, "处理中");

    private final int code;
    private final String desc;

    // 静态缓存,final 保证不可变
    private static final Map<integer status> CODE_TO_ENUM = new HashMap();
    private static final Map<string status> DESC_TO_ENUM = new HashMap();

    Status(int code, String desc) {
        this.code = code;
        this.desc = desc;
        // 构造器内注册,此时所有枚举实例已存在,安全
        CODE_TO_ENUM.put(code, this);
        DESC_TO_ENUM.put(desc, this);
    }

    public static Status fromCode(int code) {
        return CODE_TO_ENUM.get(code);
    }

    public static Status fromDesc(String desc) {
        return DESC_TO_ENUM.get(desc);
    }

    public int getCode() { return code; }
    public String getDesc() { return desc; }
}</string></integer>

进阶:支持 null 安全与默认 fallback

生产环境建议增强健壮性,避免 null 返回引发 NPE:

JavaStoryDevelop
JavaStoryDevelop

你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在

下载
  • 用 Optional<status></status> 包装返回值
  • 或提供带默认值的查找方法,例如 fromCodeOrDefault(int, Status)
  • 对 key 类型做非空校验(尤其 String 类型反查时)

示例:

public static Status fromDesc(String desc) {
    if (desc == null) return null;
    return DESC_TO_ENUM.get(desc);
}

// 或更推荐
public static Optional<status> findFromCode(int code) {
    return Optional.ofNullable(CODE_TO_ENUM.get(code));
}</status>

替代方案:使用 EnumMap 提升性能(适用于整型 key)

如果反查 key 是枚举自身或其他枚举类型,EnumMap 比 HashMap 更省内存、更快(基于数组索引)。但对 int 或 String 作为 key,仍需用 HashMap。

  • EnumMap<status string></status>:适合「枚举 → 描述」映射(正向)
  • HashMap<integer status></integer>:适合「int → 枚举」反查(无法用 EnumMap)
  • 注意:EnumMap 的 key 必须是枚举类型,不能是 int/String

这种方式简单可靠,不依赖反射、不触发额外类加载,兼顾性能与可读性。只要记住核心原则:注册动作放在构造器里,别碰 values(),Map 声明为 static final,查询方法保持无状态即可。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11277

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8402

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7232

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1204

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

968

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1456

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2969

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20231

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1315

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习