Back

java枚举成员方法

前言

刚进公司的时候,看到同事定义的枚举类中定义了一个 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 方法

我列出用的比较多的方法

  1. name()

    获取的枚举的名称,这是一个成员方法,作用和 getCode() 是一样的
  2. static valueOf(String name)

    这个方法作用和 codeOf 是一样的,这是一个静态方法,,name() 和这个方法都存在,那么 code 这个字段就没有用了
  3. ordinal()

    获取枚举定义顺序,从 0 开始,这是一个成员方法,后面开发中我看到 fastjson 的序列花配置使用到了这个方法。
    fastjson 的序列号配置存在一个 int 类型的字段中,二进制中的每一个位置存储了一个配置,使用 ordinal 方法来确定配置的二进制位置。
  4. .toString()

    底层调用的 name(),所以我在传递参数给 mybatis 时,有些字段直接传的枚举,限定参数范围。
  5. 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;
    }
}
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy