枚举入门
说句很丢人的话,学了几年java,我对于枚举类还是非常不了解,了解之后才发现枚举用处非常之大。我们通过一个简单的例子,了解枚举的前世今生。
- 在java没有枚举类的时候,我们可以创建一个普通类来表示性别。
// 1.普通类
class SexEnum{
private String s;
private SexEnum(String s){
this.s = s;
}
}
// 使用:new SexEnum("男")、new SexEnum("女")
- 性别只有男和女,每次表示性别都需要new十分不方便。于是进行精简,将对象变成类的静态变量,并且对继承以及构造函数进行限制,防止类被破坏。
// 2.使用静态变量优化
final class SexEnum{
public final static SexEnum MAN = new SexEnum("男人");
public final static SexEnum WOMAN = new SexEnum("女人");
private String s;
private SexEnum(String s){
this.s = s;
}
}
- 后来java 1.5引入了enum,可以更简便地表示对象有限的类。语法就是:枚举名+构造函数。例如MAN(“男人”),WOMAN(“女人”);用逗号隔开,分号结尾。构造函数也可以不写。
- 这些对象实际上就是枚举类的静态变量,这些在后续的字节码文件中显示得更加直观。
// 3.性别枚举
public enum SexEnum {
MAN("男人"),
WOMAN("女人");
private String s;
SexEnum(String s) {
this.s = s;
}
}
总结:枚举类就是普通类中的一种特殊情况,适用于于类对象有限且固定的情况。记住枚举类也是类,定义方法、定义变量、定义构造函数,都是可以的。只是在写法上让人有些迷糊,在后续观察过枚举类的字节码之后,会有更深的认识。
枚举类字节码
多次强调记住在java中,枚举底层实现是普通类。我们通过jad命令对枚举类进行反编译。
先跳过源码,我将要点进行了拆分,防止源码恐惧症。
public final class SexEnum extends Enum
{
public static SexEnum[] values()
{
return (SexEnum[])$VALUES.clone();
}
public static SexEnum valueOf