锁定老帖子 主题:【解惑】理解java枚举类型
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-26
最后修改:2010-09-06
枚举类型是JDK5.0的新特征。Sun引进了一个全新的关键字enum来定义一个枚举类。下面就是一个典型枚举类型的定义: public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN } 显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类。 而这些类都是类库中Enum类的子类(java.lang.Enum<E>)。它们继承了这个Enum中的许多有用的方法。我们对代码编译之后发现,编译器将enum类型单独编译成了一个字节码文件:Color.class。 final enum hr.test.Color { // 所有的枚举值都是类静态常量 public static final enum hr.test.Color RED; public static final enum hr.test.Color BLUE; public static final enum hr.test.Color BLACK; public static final enum hr.test.Color YELLOW; public static final enum hr.test.Color GREEN; private static final synthetic hr.test.Color[] ENUM$VALUES; // 初始化过程,对枚举类的所有枚举值对象进行第一次初始化 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 hr.test.Color[] values(); // 实现Enum类的抽象方法 public static hr.test.Color valueOf(java.lang.String arg0); } 下面我们就详细介绍enum定义的枚举类的特征及其用法。(后面均用Color举例) enum Color{ RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0); //构造枚举值,比如RED(255,0,0) private Color(int rv,int gv,int bv){ this.redValue=rv; this.greenValue=gv; this.blueValue=bv; } public String toString(){ //覆盖了父类Enum的toString() return super.toString()+"("+redValue+","+greenValue+","+blueValue+")"; } private int redValue; //自定义数据域,private为了封装。 private int greenValue; private int blueValue; } (2) 构造器只能私有private,绝对不允许有public构造器。 这样可以保证外部代码无法新构造枚举类的实例。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。 但枚举类的方法和数据域可以允许外部访问。 public static void main(String args[]) { // Color colors=new Color(100,200,300); //wrong Color color=Color.RED; System.out.println(color); // 调用了toString()方法 } 3、所有枚举类都继承了Enum的方法,下面我们详细介绍这些方法。
//JDK源代码: public final boolean equals(Object other) { return this==other; }
Color color=Color.RED; switch(color){ case RED: System.out.println("it's red");break; case BLUE: System.out.println("it's blue");break; case BLACK: System.out.println("it's blue");break; }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-27
以前对于Java的enum枚举类型没怎么注意,因为写代码相对少用了点,现在LZ你的文章写得详细,真的是学习了。。。
|
|
返回顶楼 | |
发表时间:2009-09-27
枚举我用的也很少 .
感谢楼主 |
|
返回顶楼 | |
发表时间:2009-09-27
的确枚举类用的很少~~~
就算用到也没深入研究~~~ 不错~~ |
|
返回顶楼 | |
发表时间:2009-09-27
枚举类用的是不多,但是一旦需要用的时候却十分的方便。
|
|
返回顶楼 | |
发表时间:2009-09-27
枚举类可以用来做单例,很方便的
|
|
返回顶楼 | |
发表时间:2009-09-27
用的人是很少,但深入了解,在业务分析中恰当的应用应该了起到很好的作用
|
|
返回顶楼 | |
发表时间:2009-09-28
以前也经常用枚举,但一直没注意到原来是直接继承了java/lang/Enu类,刚才去看了一下字节码确实是这样,谢谢。
|
|
返回顶楼 | |
发表时间:2009-09-28
wangdgsc 写道 枚举类可以用来做单例,很方便的
|
|
返回顶楼 | |
发表时间:2009-09-28
最后修改:2009-09-28
看一下Effective Java第一版,然后反编译一下enum类生成的代码,更能清楚的了解和应用。
实现分析: http://blog.csdn.net/ZangXT/archive/2008/10/29/3174741.aspx |
|
返回顶楼 | |