枚举的使用

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风格的响应实体类

可以看到的是枚举类中的一个成员就是该类的实例对象,通过该实例对象可以来调用方法。一般枚举类.枚举实例对象可以实际调用。

当然一个对象可以调用实例方法来进行调用。那么在方法中创建其它的实例对象也是没有任何问题的。是我眼光狭隘了。

posted @ 2021-08-24 00:57  雩娄的木子  阅读(171)  评论(0编辑  收藏  举报