在Java1.5中,Java增加了一个新的类型Enum。
我们先来看一个常见的枚举定义:
public enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE;
}
这个声明定义的是一个类,它有4个实例。 如果我们将其反编译,我们会得到这样的代码
public final class Size extends Enum { // 继承自Enum,标记为final class
// 每个实例均为全局唯一:
public static final Size SMALL = new Size();
public static final Size MEDIUM = new Size();
public static final Size LARGE = new Size();
public static final Size EXTRA_LARGE = new Size();
// private构造方法,确保外部无法调用new操作符:
private Size() {}
}
上面这个反编译我是参考的枚举类 - 廖雪峰网站上。
我使用了Jdk自带的javap来编译,但是却没有实例化的代码。使用了Fernflower进行了反编译,但是它直接反编译成了枚举类,不是我想要的结果。后来我又看了Java enum 枚举类的编译实现这篇文章,作者是将查看字节码然后编写出来的,发现实例化是在static静态代码块进行的。
推荐大家自己去编译一下,不然可能会看不懂我上面这段话讲的是什么。因为这里不是本篇文章重点,所以就大概写了一下。如果知道该如何查看反编译的代码(有实例化代码),希望能够告诉我
枚举的比较
我们知道如果要比较两个对象是否相等,我们要使用equals方法,而不是 ==。但是,枚举里的每一个实例都是唯一的,所以我们可以直接使用 ==来比较。
枚举常用方法
所有的枚举类型都是Enum类的子类,继承了这个类的很多方法。
- toString方法能够返回枚举常量名。比如,Size.SMALL.toString()将返回字符串"SMALL"。
- toString的逆方法是静态方法valueOf。例如:
Size s = Enum.valueOf(Size.class, "SMALL");
该语句将Size.Small赋值给变量s。
- 静态values方法,返回一个包含全部枚举值的数组
Size[] values = Size.values();
返回包含SMALL, MEDIUM, LARGE, EXTRA_LARGE的数组
- ordinal方法返回enum声明中枚举常量的位置,位置从0开始计数。例如:
Size.MEDIUM.ordinal()返回1
枚举添加构造器和方法
public enum Size {
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");
private String abbreviation;
private Size(String abbreviation) {
this.abbreviation = abbreviation;
}
public String getAbbreviation() {
return abbreviation;
}
}