【java枚举的使用】 - 从源码分析Enum类

x33g5p2x  于2022-02-16 转载在 Java  
字(2.9k)|赞(0)|评价(0)|浏览(264)

概述

枚举类用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。

例如:

  • 星期:星期一、星期二、星期三、星期四、星期五、星期六、星期天;
  • 性别:男、女;
  • 季节:春、夏、秋、冬;
  • 线程状态:创建、就绪、运行、阻塞、终止;
  • …。

当需要定义一组常量时,强烈建议使用枚举类。

自定义枚举类

构造线程状态(创建、就绪、运行、阻塞、终止)枚举类。

//自定义枚举类
class State{
    // 1.声明State对象的属性
    private final String stateName;
    private final String stateDescription;

    // 2. 私有化的构造器
    private State(String stateName, String stateDescription) {
        this.stateName = stateName;
        this.stateDescription = stateDescription;
    }

    // 3. 提供当前枚举类的多个对象
    public static final State NEW = new State("创建","尚未启动的线程的线程状态");
    public static final State WAITING = new State("就绪","等待线程的线程状态");
    public static final State RUNNING = new State("运行","正在运行线程的线程状态");
    public static final State BLOCK = new State("阻塞","线程阻塞等待监视器锁定的线程状态");
    public static final State TERMINAL = new State("终止","终止线程的线程状态");

    //4. 其他需求(如:toString()、获取对象属性等)

    public String getStateName() {
        return stateName;
    }

    public String getStateDescription() {
        return stateDescription;
    }

    @Override
    public String toString() {
        return "State{" +
                "stateName='" + stateName + '\'' +
                ", stateDescription='" + stateDescription + '\'' +
                '}';
    }
}

测试

public static void main(String[] args) {
        State running = State.RUNNING;
        System.out.println(running);
    }

关键字enum的使用

//enum关键字定义枚举类
enum State{
    // 1. 提供当前枚举类的多个对象,对象之间用“,”隔开,结束用“;”。
     NEW("创建","尚未启动的线程的线程状态"),
     WAITING("就绪","等待线程的线程状态"),
     RUNNING("运行","正在运行线程的线程状态"),
     BLOCK("阻塞","线程阻塞等待监视器锁定的线程状态"),
     TERMINAL("终止","终止线程的线程状态");

    // 2.声明State对象的属性
    private final String stateName;
    private final String stateDescription;

    // 3. 私有化的构造器
    private State(String stateName, String stateDescription) {
        this.stateName = stateName;
        this.stateDescription = stateDescription;
    }


    //4. 其他需求(如:toString()、获取对象属性等)

    public String getStateName() {
        return stateName;
    }

    public String getStateDescription() {
        return stateDescription;
    }

    @Override
    public String toString() {
        return "State{" +
                "stateName='" + stateName + '\'' +
                ", stateDescription='" + stateDescription + '\'' +
                '}';
    }
}

测试

public static void main(String[] args) {
        State running = State.RUNNING;
        System.out.println(running);

        System.out.println(State.class.getSuperclass());    //查看State枚举类的父类
    }

注:使用enum关键字定义的枚举类默认继承于java.lang.Enum

从源码分析Enum类的常用方法

java.lang.Enum类是所有Java语言枚举类型的公共基类。

常用方法

public String toString()

得到当前枚举常量的名称。可以重写这个方法来使结果更易读。

public String toString() {
        return name;
    }

valueOf(Class enumType,String name)

将一个字符串转为对应的枚举对象。要求字符串必须是枚举对象的“名字”。如果不是,抛出运行时异常。

public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                                String name) {
        T result = enumType.enumConstantDirectory().get(name);
        if (result != null)
            return result;
        if (name == null)
            throw new NullPointerException("Name is null");
        throw new IllegalArgumentException(
            "No enum constant " + enumType.getCanonicalName() + "." + name);
    }

values()

返回枚举类型的对象数组。该方法可以很方便地遍历所有枚举值。

public static void main(String[] args) {
        State[] values = State.values();
        for(State value:values){
            System.out.println(value);
        }
    }

相关文章