Java基础知识:枚举

枚举

概述

在某种情况下,一个类的对象是有限而且固定的。例如异常类,只能有五个对象(够用了)

手动实现枚举类:

  • 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类一样,枚举类可以实现一个或多个接口
  • 若需要每个枚举值在调用实现的接口方法呈现不同行为方式,则可以让每个枚举值分别来实现该方法

枚举类的方法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容