Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
这篇文章主要介绍了详解 Java 的 Enum 的使用与分析的相关资料, 需要的朋友可以参考下
java Enum 使用
示例:
- public enum EnumTest {
- FRANK("The given name of me"),
- LIU("The family name of me");
- private String context;
- private String getContext() {
- return this.context;
- }
- private EnumTest(String context) {
- this.context = context;
- }
- public static void main(String[] args) {
- for (EnumTest name: EnumTest.values()) {
- System.out.println(name + ":" + name.getContext());
- }
- System.out.println(EnumTest.FRANK.getDeclaringClass());
- }
- }
Java 中枚举实现的分析:
示例:
- public enum Color{
- RED,BLUE,BLACK,YELLOW,GREEN
- }
显然, enum 很像特殊的 class, 实际上 enum 声明定义的类型就是一个类 而这些类都是类库中 Enum 类的子类 (java.lang.Enum<E>) 它们继承了这个 Enum 中的许多有用的方法我们对代码编译之后发现, 编译器将 enum 类型单独编译成了一个字节码文件: Color.class
Color 字节码代码
- 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 举例)
1Color 枚举类就是 class, 而且是一个不可以被继承的 final 类其枚举值 (RED,BLUE...) 都是 Color 类型的类静态常量, 我们可
以通过下面的方式来得到 Color 枚举类的一个实例:
Color c=Color.RED;
注意: 这些枚举值都是 public static final 的, 也就是我们经常所定义的常量方式, 因此枚举类中的枚举值最好全部大写
2 即然枚举类是 class, 当然在枚举类型中有构造器, 方法和数据域但是, 枚举类的构造器有很大的不同:
(1) 构造器只是在构造枚举值的时候被调用
- 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 的方法, 下面我们详细介绍这些方法
(1) ordinal()方法: 返回枚举值在枚举类种的顺序这个顺序根据枚举值声明的顺序而定
- Color.RED.ordinal(); // 返回结果: 0
- Color.BLUE.ordinal(); // 返回结果: 1
(2) compareTo()方法: Enum 实现了 java.lang.Comparable 接口, 因此可以比较象与指定对象的顺序 Enum 中的 compareTo 返回的是两个枚举值的顺序之差当然, 前提是两个枚举值必须属于同一个枚举类, 否则会抛出 ClassCastException()异常(具体可见源代码)
Color.RED.compareTo(Color.BLUE); // 返回结果 -1
(3) values()方法: 静态方法, 返回一个包含全部枚举值的数组
- Color[] colors=Color.values();
- for(Color c:colors){
- System.out.print(c+",");
- }// 返回结果: RED,BLUE,BLACK YELLOW,GREEN,
(4) toString()方法: 返回枚举常量的名称
- Color c=Color.RED;
- System.out.println(c);// 返回结果: RED
(5) valueOf()方法: 这个方法和 toString 方法是相对应的, 返回带指定名称的指定枚举类型的枚举常量
Color.valueOf("BLUE"); // 返回结果: Color.BLUE
(6) equals()方法: 比较两个枚举类对象的引用
- //JDK 源代码:
- public final boolean equals(Object other) {
- return this == other;
- }
4 枚举类可以在 switch 语句中使用
- 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;
- }
来源: http://www.phperz.com/article/18/0212/358615.html