先来一段源码:
public enum WeekDay {
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
再来看一下这段源码的底层实现(反编译结果):
public final class WeekDay extends Enum
{
public static final WeekDay MONDAY;
public static final WeekDay TUESDAY;
public static final WeekDay WEDNESDAY;
public static final WeekDay THURSDAY;
public static final WeekDay FRIDAY;
public static final WeekDay SATURDAY;
public static final WeekDay SUNDAY;
private static final WeekDay ENUM$VALUES[];
private WeekDay(String s, int i)
{
super(s, i);
}
public static WeekDay[] values()
{
WeekDay aweekday[];
int i;
WeekDay aweekday1[];
System.arraycopy(aweekday = ENUM$VALUES, 0, aweekday1 = new WeekDay[i = aweekday.length], 0, i);
return aweekday1;
}
public static WeekDay valueOf(String s)
{
return (WeekDay)Enum.valueOf(note/WeekDay, s);
}
static
{
MONDAY = new WeekDay("MONDAY", 0);
TUESDAY = new WeekDay("TUESDAY", 1);
WEDNESDAY = new WeekDay("WEDNESDAY", 2);
THURSDAY = new WeekDay("THURSDAY", 3);
FRIDAY = new WeekDay("FRIDAY", 4);
SATURDAY = new WeekDay("SATURDAY", 5);
SUNDAY = new WeekDay("SUNDAY", 6);
ENUM$VALUES = (new WeekDay[] {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
});
}
}
首先,枚举类隐式继承了Enum,Enum是所有java语言枚举类型的公共基类,包含一个valueOf方法,这个方法上边的源码中是有具体实现的
我们自己定义的属性被自动转换为静态常量,通过静态代码块(最高优先级)完成了静态final的二次赋值,并为他们设置了下标,在swith中传入枚举参数,实际上判断的就是这些下标!(0,1,2,...)
同时枚举类将用户定义的所有属性封装为了一个本类类型的数组,调用values方法可以获取这个数组,但是在JDK的API里,是没有这个方法的,这个方法只有看了底层源码才会了解,同时这个方法返回的不是本类的原生数组,而是复制版
另外可以看到这个枚举为饿汉式的单例设计模式,那这就有意思了,因为我们可以来个枚举单例:
//枚举单例(最简单):
public enum Demo{
INSTANCE
}