枚举
概述
在某种情况下,一个类的对象是有限而且固定的。例如异常类,只能有五个对象(够用了)
手动实现枚举类:
- private 修饰构造器
- 属性使用private final 修饰
- 把该类的所有实例都用public static final来修饰
package com.sen.common.api;
import com.sun.org.apache.bcel.internal.generic.NEW;
public class AppiErrorCode {
private final Integer code;
private final String message;
/**
* 成功
*/
private static AppiErrorCode SUCCESS = new AppiErrorCode(200, "操作成功");
/**
* 失败
*/
private static AppiErrorCode FAILED = new AppiErrorCode(-1, "操作失败");
/**
* 未登录,Token过期
*/
private static AppiErrorCode UNAUTHORIZED = new AppiErrorCode(401, "暂未登录或token已经过期");
/**
* 权限不足
*/
private static AppiErrorCode FORBIDDEN = new AppiErrorCode(403, "权限不足");
/**
* 参数校验错误
*/
private static AppiErrorCode VALIDATE_FAILED = new AppiErrorCode(404, "参数检验失败");
private AppiErrorCode(Integer code, String message) {
this.code = code;
this.message = message;
}
public static AppiErrorCode getSUCCESS() {
return SUCCESS;
}
public static AppiErrorCode getFAILED() {
return FAILED;
}
public static AppiErrorCode getUNAUTHORIZED() {
return UNAUTHORIZED;
}
public static AppiErrorCode getFORBIDDEN() {
return FORBIDDEN;
}
public static AppiErrorCode getValidateFailed() {
return VALIDATE_FAILED;
}
public static void main(String[] args) {
AppiErrorCode failed = AppiErrorCode.getFAILED();
AppiErrorCode failed1 = AppiErrorCode.getFAILED();
//true
System.out.println(failed.equals(failed1));
}
}
上述,就是创建了五个单例
引用enum枚举类
- JDK 1.5新增的enum关键字用于定义枚举类
- 枚举类和普通类的区别:
- 使用enum定义的枚举类默认继承了java.lang.Enum类
- 枚举类的构造器只能使用private访问控制符
- 枚举类的所有实例必须在枚举类中显式列出(,分号;结尾)列出的实例系统会自动添加public static final修饰
- 所有的枚举类都提供一个values方法,该方法可以很方便地遍历所有的枚举值
- JDK1.5中可以在switch表达式中使用枚举类的对象作为表达式,case子句可以直接使用枚举值的名字,无需添加枚举类作为限定
- 若枚举只有一个成员,则可以作为一种单子模式的实现方式
package com.sen.common.api;
public enum ApiErrorCode implements IErrorCode {
/**
* 成功
*/
SUCCESS(200, "操作成功"),
/**
* 失败
*/
FAILED(-1, "操作失败"),
/**
* 未登录,Token过期
*/
UNAUTHORIZED(401, "暂未登录或token已经过期"),
/**
* 权限不足
*/
FORBIDDEN(403, "权限不足"),
/**
* 参数校验错误
*/
VALIDATE_FAILED(404, "参数检验失败");
private final Integer code;
private final String message;
ApiErrorCode(int code, String message) {
this.code = code;
this.message = message;
}
@Override
public Integer getCode() {
return code;
}
@Override
public String getMessage() {
return message;
}
@Override
public String toString() {
return "ApiErrorCode{" +
"code=" + code +
", message='" + message + '\'' +
'}';
}
}
//相当于调用ApiErrorCode的私有构造方法,获得一个ApiErrorCode对象success
ApiErrorCode success = ApiErrorCode.SUCCESS;
ApiErrorCode success1 = ApiErrorCode.SUCCESS;
//true ,每次执行ApiErrorCode.SUCCESS获得相同的对象,枚举类中的每个枚举都是单例模式的
System.out.println(success.equals(success1));
实现接口的枚举
- 和普通的java类一样,枚举类可以实现一个或多个接口
- 若需要每个枚举值在调用实现的接口方法呈现不同行为方式,则可以让每个枚举值分别来实现该方法