一、什么是枚举类
1.什么是枚举
一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数
2.枚举类 : 只包含可选枚举对象的类
二、为什么要使用枚举类
没有枚举类的情况下,模拟枚举:
一般通过定义一个或多个只包含常量的类,如我们定义接口响应的错误对象:
- 一个定义状态码的类
- 一个定义提示信息的类
/**
* 错误码类
*/
class ErrorCode {
public final static int SERVER_ERROR = 9000;
public final static int PARAM_SERVER = 4001;
public final static int DB_SERVER = 5001;
public final static int CACHE_ERROR = 6001;
public final static int UNKNOWN_ERROR = 9999;
}
/**
* 错误提示信息类
*/
class ErrorMsg {
public final static String SERVER_ERROR = "服务端错误";
public final static String PARAM_SERVER = "参数错误";
public final static String DB_SERVER = "数据库错误";
public final static String CACHE_ERROR = "缓存错误";
public final static String UNKNOWN_ERROR = "未知错误";
}
public class Contants {
public static void main(String[] args) {
System.out.println(ErrorCode.CACHE_ERROR);
System.out.println(ErrorMsg.CACHE_ERROR);
}
}
上面这个例子的问题:
- 定义了很多冗余的信息,比如ErrorCode的错误码类,除了具体的数字不一样,其他的都是一样的类型
- 当要输出某类错误时,要查错误码的具体的某个码值,还要查错误信息类的对应的提示信息,如何对应是一个问题
三、如何定义枚举类
enum [类名] {
}
- 和定义普通类很相似,普通类是用class关键词来标注,而枚举类很enum关键词来标明
enum ResponseError {
SERVER_ERROR(9000, "服务端错误"),
PARAM_ERROR(4001, "参数错误"),
DB_ERROR(5001, "数据库错误"),
CACHE_ERROR(6001, "缓存错误"),
UNKNOWN_ERROR(9999, "未知错误");
//错误码
private int code;
//错误提示信息
private String message;
ResponseError(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return this.code;
}
public String getMessage() {
return this.message;
}
}
public class EnumDemo {
public static void main(String[] args) {
System.out.println(ResponseError.PARAM_ERROR.getCode()); //4001
System.out.println(ResponseError.PARAM_ERROR.getMessage()); //参数错误
}
}
四、枚举类的实质及特点
- 枚举类实质上是一个继承自Enum类的类(不需要显示声明它继承于Enum)
- 枚举类的实例化方法是不能加权限修饰符的(它实质上是一个私有的),即它不能在类外部对枚举类进行实例化
- 枚举类中的枚举对象,如上例中的SERVER_ERROR等相当于在类内部实例化后的对外开放的实例对象
我们编译上面的例子,发现:
enum ResponseError {
SERVER_ERROR(9000, "服务端错误"),
PARAM_ERROR(4001, "参数错误"),
DB_ERROR(5001, "数据库错误"),
CACHE_ERROR(6001, "缓存错误"),
UNKNOWN_ERROR(9999, "未知错误");
private int code;
private String message;
//变成私有实例化方法了
private ResponseError(int var3, String var4) {
this.code = var3;
this.message = var4;
}
public int getCode() {
return this.code;
}
public String getMessage() {
return this.message;
}
}