1.使用场景和属性
有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便
- enum和class、interface的地位一样,可以实现一个或则多个接口
- 使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类
- 枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器,系统会自动添加public static final修饰无需程序显式添加
- 枚举类默认提供了一个value()方法,该方法可以很方便的遍历所有的枚举值
- 枚举类的构造器只能是私有的
2.枚举类简单实现
实现一个转态枚举类,定义状态码与转态说明属性;定义属性的set/get 方法
public enum ProcessStatusEnum implements Status {
SUCCESS(0, "success"),
ERROR(1, "error"),
//参数异常
ILLEGAL_ARGUMETN(10001, "非法的参数"),
//数据库异常
DB_ERROR_WRITE(20001, "数据库写入异常"),
DB_ERROR_READ(20002, "数据库查询异常"),
//权限异常
NO_PERMISSION(30001, "没有权限"),
INTEGRAL_NOT_ENOUTGN(30002, "用户积分不足"),
//服务异常
SERVICE_EXCEPTION(40001, "服务异常"),
UNKNOWN_ERROR(60001, "未知的错误,请联系管理员进行处理!"),
//参数校验
PARAMETER_VALIDATION_ERROR(70001, "参数校验错误"),
//用户
USERNAME_REPEAT(80001,"用户名重复"),
//查询结果
PAGE_NUM_OUT_OF_RANGE(9001, "查询页码超出范围");
//处理状态码
private final int code;
//描述信息
private String message;
ProcessStatusEnum(int code, String message) {
this.code = code;
this.message = message;
}
@Override
public String getMessage() {
return this.message;
}
@Override
public int getCode() {
return this.code;
}
@Override
public Status setMessage(String message) {
this.message = message;
return this;
}
}
写枚举类实例的时候,默认是调用了构造器的,所以此处需要传入参数,因为没有显式申明无参构造器,只能调用有参数的构造器。
3.枚举类的相关函数
valueOf() 方法:它的作用是传来一个字符串,然后将它转变为对应的枚举变量。前提是你传的字符串和定义枚举变量的字符串一抹一样,区分大小写。如果你传了一个不存在的字符串,那么会抛出异常。
values()方法:这个方法会返回包括所有枚举变量的数组,可以方便的用来做循环。
ordinal()方法:默认请款下,枚举类会给所有的枚举变量一个默认的次序,该次序从0开始,类似于数组的下标。而.ordinal()方法就是获取这个次序(或者说下标)。
从反编译的代码可以看出编译器确实帮助我们生成了一个ProcessStatusEnum类(注意该类是final类型的,将无法被继承)而且该类继承自java.lang.Enum类。除此之外,编译器还帮助我们生成了实例对象分别对应枚举中定义的对象,这也充分说明了我们前面使用关键字enum定义的每种枚举常量也是实实在在的实例对象,只不过代表的内容不一样而已。注意编译器还为我们生成了两个静态方法,分别是values()和 valueOf(),如上所示。