java枚举类型的使用


应用场景

枚举用来表示一类值域范围有限的值,比如状态、性别等。java枚举值可以把每个值实例化成一个对象,为每个对象指定多个属性,方便维护管理。

优点:

  • 按值实例化,每个实例可以指定多个属性以及实现抽象方法,方便维护和扩展
  • 常量值地址唯一,可以用==直接对比,性能会有提高
  • 编译时,没有把常量值编译到代码里,即使常量的值发生变化也不会影响引用常量的类
  • 安全,java枚举类使用final修饰,不能被继承,实例均为static final修饰,构造器只能为私有,且在jvm层面限制不能被反射获取,天生有利于构造单例对象

使用注意点

  1. java枚举类均继承自java.lang.Enum,故无法继承其他类,但可以实现多个接口
  2. 所有实例定义均要写在类起始处
  3. 实例的多个属性与构造器相呼应,属性一般定义为private,构造器只能为private
  4. 通过字节码反编译,可确认实例均为static final修饰
  5. 枚举类中可以定义抽象方法,每个实例可以通过匿名内部类方式实现方法
  6. 枚举类的values()方法可以返回所有实例对象,values方法由编译器生成
  7. 枚举类的valueOf()可以根据实例的name()方法获取实例对象
  8. 枚举类可以方便、安全的实现单列模式(推荐使用)

使用案例

public enum ApiCode {
    /**
     * 接口调用返回码
     */
    SUCCESS("00000", "成功"),
    FAILURE("11111", "失败"),
    RESPONSE_ERROR_TYPE("11112", "响应异常"),
    VERIFY_FAIL("11113", "缺少对应的参数");


    private String code;
    private String desc;

    private ApiCode(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public static ApiCode getApiCodeByCode(String code) {
        if (StringUtils.isEmpty(code)) {
            return null;
        }
        ApiCode[] codes = ApiCode.values();
        for (ApiCode responseCode : codes) {
            if (responseCode.getCode().equals(code)) {
                return responseCode;
            }
        }
        return null;
    }

    public String getCode() {
        return this.code;
    }

    public String getDesc() {
        return this.desc;
    }

    public String toString() {
        return this.getClass().getName() + "." + this.name() + "{code=" + this.getCode() + ", desc=" + this.getDesc() + "}";
    }
}