values()是编译器自动生成的静态方法,返回按声明顺序排列的所有枚举常量数组,用于遍历;注意其每次调用新建数组、不可在初始化块中使用、不支持继承调用。

Java 枚举类的 values() 方法是静态方法,用于返回该枚举类所有枚举常量的数组,按声明顺序排列。它是遍历枚举所有状态最常用、最直接的方式。
values() 方法的基本用法
values() 是编译器自动为每个枚举类生成的静态方法,无需手动定义。它返回一个包含所有枚举实例的数组(类型为 MyEnum[]),可直接用于增强 for 循环或传统索引遍历。
例如:
public enum Status {
PENDING,
PROCESSING,
COMPLETED,
FAILED
}
遍历所有状态:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
for (Status status : Status.values()) {
System.out.println(status); // 输出:PENDING、PROCESSING、COMPLETED、FAILED
}
配合 switch 或条件逻辑使用
遍历时常需要根据枚举值执行不同逻辑。可以结合 switch(Java 14+ 支持枚举直接 switch)或 if-else 判断:
- 用
switch处理每种状态(推荐,语义清晰、编译期检查) - 避免用字符串比较(如
status.name().equals("PENDING")),效率低且易出错 - 若需扩展行为,可考虑在枚举中定义抽象方法或字段,而非外部 if 堆砌
注意 values() 的局限性和替代方案
values() 返回的是新创建的数组,每次调用都新建对象,频繁调用可能影响性能(一般场景可忽略)。若需复用或更灵活控制,可考虑:
- 用
EnumSet.allOf(MyEnum.class)获取不可变集合,适合需要集合操作(如 contains、stream)的场景 - 手动定义静态 final List(如
public static final List<Status> ALL = List.of(PENDING, PROCESSING, COMPLETED, FAILED);),避免重复创建数组 - 不建议缓存
values()结果到静态变量——虽可行,但违背枚举设计初衷,且易引发维护混淆
常见误区提醒
-
values()不是继承自父类,不能通过子类引用调用(枚举不能被继承) - 不能在枚举常量初始化块中调用
values()(会触发类初始化循环,抛java.lang.ExceptionInInitializerError) - 数组长度固定,与枚举常量数量一致,
values().length可安全用于边界判断

















