------- android培训、java培训、期待与您交流! ----------
首先我们知道枚举是一个特殊的类,构造方法是私有的,那么它的对象是如何构造的呢?或者说是什么时候构造的呢?带着这个疑问,我查阅了一下枚举类的反编译代码(可能不准确,仅供参考)
enum Color {
// 所有的枚举值都是类静态常量
public static final Color RED;
public static final Color BLUE;
public static final Color BLACK;
public static final Color YELLOW;
public static final Color GREEN;
// 初始化过程,对枚举类的所有枚举值对象进行第一次初始化
static {
0 new hr.test.Color [1]
3 dup
4 ldc <String "RED"> [16] //把枚举值字符串"RED"压入操作数栈
6 iconst_0 // 把整型值0压入操作数栈
7 invokespecial hr.test.Color(java.lang.String, int) [17] //调用Color类的私有构造器创建Color对象RED
10 putstatic hr.test.Color.RED : hr.test.Color [21] //将枚举对象赋给Color的静态常量RED。
......... 枚举对象BLUE等与上同
102 return
};
// 私有构造器,外部不可能动态创建一个枚举类对象(也就是不可能动态创建一个枚举值)。
private Color(java.lang.String arg0, int arg1){
// 调用父类Enum的受保护构造器创建一个枚举对象
3 invokespecial java.lang.Enum(java.lang.String, int) [38]
};
public static Color[] values();
// 实现Enum类的抽象方法
public static Color valueOf(String arg0);
}
源码之前,了无秘密。通过上面的源码我们可以看到,枚举类型的各个值是在这个类第一次被类加载器加载的时候在静态代码中被构建的,当类加载完成后,类的各个对象就都已经生成好了,有且只有一份,所以它可以用来实现单例模式。
通过观看张孝祥老师的视频,我发现枚举在描述一定个数的具有相同属性的元素方面具有特别好的效果。比如交通灯项目中的路,只有8条(只说明问题,不管实际是双向四车道还是双向八车道),个数是一定的,而且功能相似。再比如银行业务系统中服务窗口一共有6个,数目也是固定的而且属性相似。这些问题都可以抽象成枚举,当然你用单例模式也是可以的,但是没有枚举直观。我想这也就是枚举存在的真正意义吧!简化了人们的开发,对问题的描述更加准确。
所有的枚举类都继承了Enum的方法,具体每个方法都起到什么作用请自行查看API,在这里就不做详细介绍了。