java枚举类型的使用
应用场景
枚举用来表示一类值域范围有限的值,比如状态、性别等。java枚举值可以把每个值实例化成一个对象,为每个对象指定多个属性,方便维护管理。
优点:
- 按值实例化,每个实例可以指定多个属性以及实现抽象方法,方便维护和扩展
- 常量值地址唯一,可以用==直接对比,性能会有提高
- 编译时,没有把常量值编译到代码里,即使常量的值发生变化也不会影响引用常量的类
- 安全,java枚举类使用final修饰,不能被继承,实例均为static final修饰,构造器只能为私有,且在jvm层面限制不能被反射获取,天生有利于构造单例对象
使用注意点
- java枚举类均继承自java.lang.Enum,故无法继承其他类,但可以实现多个接口
- 所有实例定义均要写在类起始处
- 实例的多个属性与构造器相呼应,属性一般定义为private,构造器只能为private
- 通过字节码反编译,可确认实例均为static final修饰
- 枚举类中可以定义抽象方法,每个实例可以通过匿名内部类方式实现方法
- 枚举类的values()方法可以返回所有实例对象,values方法由编译器生成
- 枚举类的valueOf()可以根据实例的name()方法获取实例对象
- 枚举类可以方便、安全的实现单列模式(推荐使用)
使用案例
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() + "}"; } }