枚举常量和类中public static final常量均采用UPPER_SNAKE_CASE命名,但枚举是类型安全的实例,支持方法、迭代与switch;类常量仅为不可变值引用,无行为能力。

Java 枚举常量命名用 UPPER_SNAKE_CASE(全大写+下划线),类中定义的 public static final 常量也推荐同样风格,但二者本质不同:枚举常量是类型安全的实例,类常量是原始值或对象引用。
枚举常量必须大写下划线命名
Java 语言规范虽未强制,但《Effective Java》及主流规范(如 Google Java Style)明确要求:枚举常量名应全部大写,单词间用下划线分隔,例如:
- RED、HTTP_NOT_FOUND、USER_ROLE_ADMIN
- 不写成 red、Red 或 userRoleAdmin
- 这是为了视觉上区别于普通变量/方法,也符合常量语义——它代表一个固定、不可变的枚举实例
类中 public static final 常量同样适用 UPPER_SNAKE_CASE
当在普通类里定义不可变常量时,命名风格与枚举一致,例如:
- public static final int MAX_RETRY_COUNT = 3;
- public static final String DEFAULT_ENCODING = "UTF-8";
- public static final Duration TIMEOUT = Duration.ofSeconds(30);
- 注意:仅限 编译期常量(基本类型或字符串字面量)会被内联;其他对象引用(如 Duration)虽不可变,但不属于“编译时常量”,命名仍保持统一风格
核心区别不在命名,而在语义与能力
命名相似只是表象,二者设计目的和使用方式差异显著:
立即学习“Java免费学习笔记(深入)”;
- 枚举常量 是 该枚举类型的唯一实例,自带类型安全、可迭代、可 switch、可携带字段和方法等能力
- 类常量 是简单赋值,本质是变量(final 修饰),无行为、无继承关系、无法遍历,仅提供一个命名的固定值
- 选哪个?如果值有明确有限集合、需类型约束或未来可能扩展行为(如 getDisplayName()),优先用 enum;如果只是配置数字、字符串等“数据常量”,用 public static final 即可
常见误区提醒
避免因命名相似而混淆用途:
- 不要把枚举当成“一组常量集合”就完事——它是个类,可以有构造器、抽象方法、具体方法
- 不要在工具类里堆砌大量 public static final 字符串来模拟枚举,这丧失类型检查,运行时易出错
- 枚举类本身名称用 PascalCase(如 HttpStatus、OrderStatus),与其常量命名风格区分开
- 包级常量(如定义在接口中)已过时,不推荐;现代 Java 应使用 enum 或 final 类 + 静态常量









