枚举的使用
java中的枚举是一个特殊的类。Java 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 public、final、 static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。
一个人的性别是男、女,一个星期只有七天等类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。
public enum Sex {
BOY,GIRL;
}
一个最简单的枚举类
那么这个类就相当于是:
// 枚举的本质是一个类,我们刚才定义的Sex枚举相当于下面的类
// 这个枚举类不允许被继承,而是也不能去继承其他的类。因为java中要求的是单继承
final class SEX extends java.lang.Enum<SEX> {
// BOY和GIRL是两个对象的引用。
public static final SEX BOY = new SEX();
public static final SEX GIRL = new SEX();
// 以数组形式返回所有的类的成员
public static SEX[] values();
// 将字符串转换成枚举实例
public static SEX valueOf(java.lang.String);
// 枚举类在初始化需要做的事情
static {};
}
其实实际上使用的方法就是这么多,还有一些其他的方法,但是通常来说不会使用那么多。
还需要注意一些地方,如果直接按照下面的方式来写:
public enum Sex {
BOY,GIRL;
}
这里的构造方法已经被私有化了。
下面看个案例:
public enum UserEnum {
GUANG(1,"guang");
private Integer id;
private String username;
private UserEnum(Integer id, String username) {
this.id = id;
this.username = username;
}
public Integer getId() {
return id;
}
public String getUsername() {
return username;
}
}
在测试类中:
public class TestDemo {
public static void main(String[] args) {
System.out.println(UserEnum.GUANG.getId());
System.out.println(UserEnum.GUANG.getUsername());
System.out.println(UserEnum.GUANG.name());
UserEnum[] values = UserEnum.values();
int length = values.length;
for (int i = 0; i < length; i++) {
System.out.println("枚举的名字是:"+values[i].name());
System.out.println("枚举的值是:"+values[i]);
}
}
}
其实使用枚举的地方还是很多的,在开发中经常可以遇到这种写法。所以决定在自定义异常的时候采用这种写法。
public enum ServiceExceptions {
SSSS(200, "处理成功"),
U001(111, "系统未知异常"),
S001(112, "调用异常相关"),
S002(113, "参数传递异常相关"),
S003(114, "数据错误相关"),
S004(104, "异步执行异常"),
S005(105, "解析请求失败"),
U001(201, "具体系统异常相关");
// 响应状态码
private Integer errCode;
// 响应信息
private String errMsg;
// 构造方法
private ServiceExceptions(Integer errCode, String errMsg) {
this.errCode = errCode;
this.errMsg = errMsg;
}
// 在枚举类中只是提供了get方法
public Integer getErrCode() {
return this.errCode;
}
public String getErrMsg() {
return this.errMsg;
}
// 采用的是build模式来进行操作
public ServiceException buildServiceException(String errMsg) {
// 这里是一个异常类,继承来自Exception类。但是这里可以自定义错误信息,因为状态码已经规定好了
return new ServiceException(this.errCode, errMsg);
}
// 这里来自定义异常和错误信息描述
public ServiceException buildServiceException(String errMsg, Throwable t) {
return new ServiceException(this.errCode, errMsg, t);
}
// 这里使用自定义的来进行
public ServiceException buildServiceException() {
return new ServiceException(this.errCode, this.errMsg);
}
// 自定义异常
public ServiceException buildServiceException(Throwable t) {
return new ServiceException(this.errCode, this.errMsg, t);
}
// 通过状态码来找到异常实例
public static ServiceExceptions findServiceExceptions(Integer errCode) {
if (errCode == null) {
return null;
} else {
ServiceExceptions[] var1 = values();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
ServiceExceptions serviceExceptions = var1[var3];
if (serviceExceptions.getErrCode().equals(errCode)) {
return serviceExceptions;
}
}
return null;
}
}
}
再看下自定义的ServiceException类:
public class ServiceException extends Exception {
// 错误码和错误信息类
private Integer errCode;
private String errMsg;
// 提供了两个异常实例。为什么要有这里的super,可以查看Exception类中的实例。也是可以来进行访问的。
public ServiceException(Integer errCode, String errMsg) {
super(errMsg);
this.errCode = errCode;
this.errMsg = errMsg;
}
public ServiceException(Integer errCode, String errMsg, Throwable t) {
super(errMsg, t);
this.errCode = errCode;
this.errMsg = errMsg;
}
// 提供了指定的get方法
public Integer getErrCode() {
return this.errCode;
}
public String getErrMsg() {
return this.errMsg;
}
}
所以在使用的时候
if (this.data == null || this.data.getPage() == null) {
// 直接使用异常来进行操作即可,而不需要再去直接进行new。而且可以自定义给出错误信息。
throw ServiceExceptions.F999.buildServiceException("报文data.page为空");
}
可以看到使用枚举类对应的实例,实际调用方法来调用异常实例的方法,这个的异常错误信息是可以自定义对应的消息的,但是状态码是无法来进行改变的,也就是说这里的状态码是统一使用的。
与之对应的还可以创建出来对应的响应restful风格的响应实体类
可以看到的是枚举类中的一个成员就是该类的实例对象,通过该实例对象可以来调用方法。一般枚举类.枚举实例对象可以实际调用。
当然一个对象可以调用实例方法来进行调用。那么在方法中创建其它的实例对象也是没有任何问题的。是我眼光狭隘了。
从理论中来,到实践中去,最终回归理论