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
相关产品推荐
相关产品推荐

