You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java获取枚举名称字符串列表:优化冗余枚举实现问询

优化枚举类:移除冗余字段并高效获取名称列表

嘿,你的这个场景其实很典型——当枚举的value和自身name完全一致时,确实没必要额外维护重复的字段,咱们可以把枚举简化得更清爽,同时还能优化名称列表的获取效率。

第一步:移除冗余的value字段

首先,Java的Enum类本身就自带了name()方法,会返回枚举实例的字符串名称(比如APPLICATION.name()就返回"APPLICATION"),所以你当前枚举里的value字段、构造器完全是冗余的,可以直接删掉,简化后的枚举结构会干净很多。

第二步:缓存名称列表提升性能

因为枚举实例是固定不变的,对应的名称列表也不会改变,所以我们可以把这个列表提前初始化并缓存起来,避免每次调用names()方法都重新创建流、收集集合——尤其是在多处频繁调用的场景下,缓存能显著提升性能,同时保证线程安全(枚举类的静态常量在类加载阶段初始化,天然线程安全)。

优化后的完整代码如下:

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public enum Forms {
    APPLICATION, VALIDATION, TARGETS;

    // 提前初始化并缓存不可修改的名称列表
    private static final List<String> NAME_LIST = Collections.unmodifiableList(
        Stream.of(values())
              .map(Enum::name)
              .collect(Collectors.toList())
    );

    public static List<String> names() {
        return NAME_LIST;
    }
}

额外说明

  • 用Collections.unmodifiableList包装列表是为了防止外部代码意外修改这个列表,保证数据的不可变性和安全性;
  • 如果之后你需要修改某个枚举的名称,只需要修改枚举实例本身即可,不用再同步修改构造器的参数,减少了维护成本;
  • 如果只是偶尔需要遍历枚举名称,直接用Forms.values()也能实现,但封装成names()方法并缓存列表,更符合复用性和可读性的要求,尤其适合多处调用的场景。

内容的提问来源于stack exchange,提问作者AnOldSoul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:52:38