[Java]枚举
来源:互联网 发布:mysql显示表字段 编辑:程序博客网 时间:2024/06/07 16:44
用法
在JDK 1.5之前通常用final来定义各种常量,现在新加了枚举类型,最简单的用法如下:
enum Color { RED, GREEN}
还可以像普通的类那样自己定义属性和方法:
enum Color { RED("red"), GREEN("green"); String name; Color(String name) { this.name = name; } public String toString(){ return name; }}
甚至enum还可以去实现接口:
enum Color implements Comparable<Color> { RED, GREEN;}
在使用的时候,枚举可以用来比较:
Color c = Color.RED; if(c == Color.GREEN){ // ... }也可以用来switch:
Color c = Color.RED; switch (c) { case RED: case GREEN: }
而且你可以很方便的变量一个枚举类型中所有的属性:
for (Color c : Color.values()) { System.out.println(c); }甚至在你只知道枚举的变量名的时候也能拿到对应的属性:
System.out.println(Color.valueOf("RED"));
枚举VS常量
首先不同的枚举类是不同的类型,而你用final static修饰的一般都是int等基本类型,这样的常量不容易做到类型检查,这也算是一个枚举的优势:
public static void check(Color c){ }如果你想封装一种类型的常量类型检查的话(除非有现成的类),为什么不用enum?
enum到底是什么
在编译之后会有一个Color.class文件,使用javap查看:
final class Color extends java.lang.Enum implements java.lang.Comparable{public static final Color RED;public static final Color GREEN;public static Color[] values();public static Color valueOf(java.lang.String);static {};}
该类继承自:
java.lang.Enum
然后通过javap -c Color来看初始化的代码:
static {}; Code: 0: new #4; //class Color 3: dup 4: ldc #7; //String RED 6: iconst_0 7: invokespecial #8; //Method "<init>":(Ljava/lang/String;I)V 10: putstatic #9; //Field RED:LColor; 13: new #4; //class Color 16: dup 17: ldc #10; //String GREEN 19: iconst_1 20: invokespecial #8; //Method "<init>":(Ljava/lang/String;I)V 23: putstatic #11; //Field GREEN:LColor; 26: iconst_2 27: anewarray #4; //class Color 30: dup 31: iconst_0 32: getstatic #9; //Field RED:LColor; 35: aastore 36: dup 37: iconst_1 38: getstatic #11; //Field GREEN:LColor; 41: aastore 42: putstatic #1; //Field $VALUES:[LColor; 45: return
这里大家可能会对枚举switch有疑问,我们写代码来看下:
public class Test { public void func(Color c){ switch(c){ case RED: case GREEN: } }}然后用javap -c查看,得到:
public void func(Color); Code: 0: getstatic #2; //Field Test$1.$SwitchMap$Color:[I 3: aload_1 4: invokevirtual #3; //Method Color.ordinal:()I 7: iaload 8: lookupswitch{ //2 1: 36; 2: 36; default: 36 } 36: return}可以看到这里switch的其实还是enum类中的ordinal(int),和之前我们对switch的认识是一致的。
----------END----------
3 0
- JAVA 枚举
- java枚举
- java枚举
- Java 枚举
- Java 枚举
- Java 枚举
- java 枚举
- java 枚举
- java枚举
- java枚举
- java枚举
- java枚举
- Java枚举
- java枚举
- java 枚举
- java枚举
- Java枚举
- Java枚举
- json中的list转换成普通的list
- chrome下 ext3.x中 datefield 宽度异常的解决
- 用CCLayerColor设置背景颜色
- PHP mysql_query() 函数
- ubuntu 访问小米3的文件系统
- [Java]枚举
- 第八讲. 支持向量机进行机器学习——Support Vector Machine
- 判断文件的编码格式
- 利用DHT网络原理制作bt采集蜘蛛,开源版
- 芬灼忌傩侵樟安婪锥够值谘磊堤岗
- Element type "Resource" must be followed by either attribute specifications, ">" or "/>".
- Android多媒体开发【8】-- AwesomePlayer基本框架及播放流程
- Fedora里rpm 和 yum的使用
- Uva-12661-Funny Car Racing