Enum.name() 返回枚举常量声明时的原始标识符字符串,严格区分大小写、不可变、线程安全,适用于数据库存储(@Enumerated(EnumType.STRING))和JSON序列化(Jackson/Gson默认),但不适用于需用户友好的显示名场景。

在 Java 中,Enum.name() 方法返回的是枚举常量在源码中**声明时使用的标识符字符串**,它严格区分大小写、不带空格、不含特殊字符,是 JVM 为每个枚举实例自动维护的不可变字段。这个值天然适合作为数据库字段、JSON 键、配置项名或序列化标识符等持久化场景使用。
name() 的行为特点与使用前提
name() 不受 toString() 或自定义字段影响,也不经过任何转换——它就是你写 RED、HTTP_404、USER_ACTIVE 时那个字面量本身:
- 返回值恒为编译期确定的字符串,线程安全、零开销
- 若枚举常量含非法标识符字符(如空格、中文、连字符),编译直接失败,因此
name()永远是合法 Java 标识符 - 不能被覆盖(
final方法),也不响应@JsonProperty或@SerializedName等注解
持久化到数据库(JDBC / JPA)
将 name() 存入 VARCHAR 字段是最常见且推荐的做法。例如:
public enum Status { PENDING, APPROVED, REJECTED }
插入时直接用:
ps.setString(1, status.name()); // 如 "APPROVED"
JPA 中可配合 @Enumerated(EnumType.STRING) 自动映射:
@Enumerated(EnumType.STRING) private Status status;
Hibernate 会自动调用 name() 写入,查询时也按字符串精确匹配还原枚举实例。
序列化为 JSON(Jackson / Gson)
默认情况下,Jackson 使用 name() 输出枚举(除非显式配置 @JsonValue 或 WRITE_ENUMS_USING_TO_STRING):
{"status":"APPROVED"}
若需保持该行为,无需额外配置;若误加了 @JsonFormat(shape = JsonFormat.Shape.OBJECT),则会转为对象形式,失去 name() 的简洁性。Gson 同理,默认即输出名称字符串。
注意事项与替代方案
当需要存储“对用户友好”或“含空格/符号”的显示名时,name() 不适用——此时应定义独立字段(如 displayName())并手动持久化该字段:
public enum Role {
ADMIN("系统管理员"),
GUEST("访客账户");
private final String displayName;
Role(String displayName) { this.displayName = displayName; }
public String displayName() { return displayName; }
}
但注意:这种 displayName 需自行保证唯一性与稳定性,不能替代 name() 作为主键或逻辑标识。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











