Java - 枚举

75

枚举:

定义枚举:

使用enum关键字定义

class Test {
    enum Day {
        SATURDAY, SUNDAY
    }

    public static void main(String[] args) {
        Day day = Day.SATURDAY;
        System.out.println(day);
    }
}

枚举实质:

首先枚举的父类并不是Enum, 而是枚举中的枚举常量的父类才是Enum, 在上面代码中, Test类就是枚举, STATURDAY就是枚举常量

枚举的父类

public abstract class Enum<E extends Enum<E>>
        implements Constable, Comparable<E>, Serializable {
    private final String name; // 枚举常量的名字, enmu中定以的是什么name就是什么

    public final String name() {
        return name;
    }
    
    private final int ordinal; // 枚举常量的位置, 定义顺序决定
    
    public final int ordinal() {
        return ordinal;
    }
}

enum关键字定义的类中的所有以逗号分隔且没有任何修饰符的属性, 实际上是一个继承Enumpublic static final class

每个enum类都会自动生成一个private static final $VALUES属性, 是一个数组用于存放枚举常量

属性和方法:

枚举中可以定义属性, 像这样

public enum Status {

    DRAFT,
    PUBLISH,
    DELETED;

    private final Integer value;

    private final String message;
    
    public static void test() {
        
    }

    public Integer getValue() {
        return value;
    }

    public String getMessage() {
        return message;
    }
}

需要注意的是上面代码定义的是非static的属性这些属性并不属于Status而是属于每个枚举常量, 那么如果定义的属性为static才是属于Status, 方法同理

构造器:

枚举类中声明的构造器实际上是枚举常量的构造器, 构造器总是private

声明的构造器虽然看起来像是枚举的构造器, 但是实际上是为每个枚举常量声明的私有构造器, 并不属于枚举

enum Status {

    DRAFT(0, "草稿"),
    PUBLISH(1, "已发布"),
    DELETED(2, "已删除");

    private final Integer id;

    private final String message;

    /*
     * Status status = new Status(1, "2");是错误的, 编译出错, 因为这个构造器并不属于Status
     */
    Status(int id, String message) {
        this.id = id;
        this.message = message;
    }

    /*
     * 这个方法实现的是通过id来拿到对应的枚举
    */
    public static Status valueOf(int id) {
        if (id > 2) {
            return null;
        }
        for (Status statu : Status.values()) {
            if (statu.id == id) {
                return statu;
            }
        }
        return null;
    }

    public Integer getId() {
        return id;
    }

    public String getMessage() {
        return message;
    }
}