前言
刚进公司的时候,看到同事定义的枚举类中定义了一个 code 保存枚举的名字,大概是这样:
public enum TestEnum {
TEST("TEST", "测试")
;
private final String code;
private final String name;
TestEnum(String code, String name) {
this.code = code;
this.name = name;
}
// get set ...
public static TestEnum codeOf(String code) {
// 通过 code 获取枚举
}
}
首先看到的是 TEST 这个单词出现了两次,然后每个枚举都定义了 codeOf,code 和 name 方法都添加了 set 方法。
我本能上觉得,java 语言不会设计得这么傻,前两个问题应该已经有了成熟方案,于是去看枚举的父类 Enum,果然找到了。
Enum 方法
我列出用的比较多的方法
-
name()
获取的枚举的名称,这是一个成员方法,作用和 getCode() 是一样的
-
static valueOf(String name)
这个方法作用和 codeOf 是一样的,这是一个静态方法,,name() 和这个方法都存在,那么 code 这个字段就没有用了
-
ordinal()
获取枚举定义顺序,从 0 开始,这是一个成员方法,后面开发中我看到 fastjson 的序列花配置使用到了这个方法。 fastjson 的序列号配置存在一个 int 类型的字段中,二进制中的每一个位置存储了一个配置,使用 ordinal 方法来确定配置的二进制位置。
-
.toString()
底层调用的 name(),所以我在传递参数给 mybatis 时,有些字段直接传的枚举,限定参数范围。
-
values()
获取所有的枚举,这是一个静态方法,并没有写在 Enum 类中,是 jdk 生成的,底层是深拷贝枚举类中的枚举数组。 为什么要深拷贝一次呢,理由是避免枚举类中的枚举数组被修改,如果经常会调用这个方法,建议定义一个静态 List 常量保存起来,避免重复深拷贝。
其他
考虑到枚举类中的枚举都是常量,我用 final 修饰了 name 字段,避免 name 字段被无意修改,
后面升级 idea 后,枚举中没有 set 方法的字段都会自动加 final 修饰符,也就没有再手动修改了。
修改后的代码
public enum TestEnum {
TEST( "测试"),
;
private final String name;
TestEnum(String name) {
this.name = name;
}
/*
* 兼容旧代码
*/
public String getCode() {
return name();
}
public String getName() {
return name;
}
}