枚举类型

8 阅读2分钟

手动实现的枚举类

其实对于枚举类,最重要的就是关注以下几点。元素是确定的,并且不能被修改。同时不可以再添加新的元素。

class Season {
    static {
        System.out.println("加载了");
    }
    String name;
    String description;

    public static final Season SPRING = new Season("春天","温暖");
    public static final Season SUMMER = new Season("夏天","温暖");
    public static final Season AUTURM = new Season("秋天","温暖");
    public static final Season WINTER = new Season("冬天","温暖");

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + ''' +
                ", description='" + description + ''' +
                '}';
    }

    private Season(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

}

看这个代码的时候,重点解释几点。首先,构造方法被私有化,目的是不让外部创建这个类型的元素;第二点,在这个类中创建了几个static final修饰的对象,这样做的目的是让外界可以直接通过Season.SPRING的方式获得这个枚举对象;第三点,没有提供属性的set方法,目的是不希望外界修改枚举对象的内容。

Java中的枚举类 关键字enum

enum SeasonEnum {
    SPRING("春天","温暖"),SUMMER("夏天","炎热");
    String name;
    String description;

    SeasonEnum(String name, String description) {
        this.name = name;
        this.description = description;
    }
}

这样看,这个枚举类看起来比较神秘,反编译一下字节码

final class enumatlearining01.SeasonEnum extends java.lang.Enum<enumatlearining01.SeasonEnum> {

  public static final enumatlearining01.SeasonEnum SPRING;

  public static final enumatlearining01.SeasonEnum SUMMER;

  java.lang.String name;

  java.lang.String description;

  public static enumatlearining01.SeasonEnum[] values();

  public static enumatlearining01.SeasonEnum valueOf(java.lang.String);

  static {};

}

通过看上面的代码可以看出,其实就是创建的SeasonEnum类继承了Enum这个抽象类而已。同时这个类也不能再被其他类继承了,因为被final关键字修饰了。还有一个疑问,就是这个类的构造方法真的是私有的吗?看以下字节码

<(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V>

上面的这个是init方法的描述符,由此可以看出,确实是有一个构造方法同时这个构造方法还是私有的。

结论

这个enmu修饰的类,其实和我们自己构造的枚举类没什么区别。就是包装了一层

细节

枚举对象,必须声明在第一行,并用,间隔。
如果直接print枚举类,会输出这个对象的名称。原因可以看abstract Enum这个类的toString()方法。

public String toString() {
    return name;
}

在上面可以看到,直接输出的是枚举类的名称。