Java枚举与.net枚举区别详解

2020-02-27 14:01:29王旭

编译之后所对应的字节码到底是什么样的:

public final class EItemDataType extends java.lang.Enum<EItemDataType> {
 public static final EItemDataType Real;

 public static final EItemDataType Service;

 static {};
  Code:
    0: new      #1         // class EItemDataType
    3: dup
    4: ldc      #15         // String Real
    6: iconst_0
    7: iconst_1
    8: invokespecial #16         // Method "<init>":(Ljava/lang/String;II)V
   11: putstatic   #20         // Field Real:LEItemDataType;
   14: new      #1         // class EItemDataType
   17: dup
   18: ldc      #22         // String Service
   20: iconst_1
   21: iconst_2
   22: invokespecial #16         // Method "<init>":(Ljava/lang/String;II)V
   25: putstatic   #23         // Field Service:LEItemDataType;
   28: iconst_2
   29: anewarray   #1         // class EItemDataType
   32: dup
   33: iconst_0
   34: getstatic   #20         // Field Real:LEItemDataType;
   37: aastore
   38: dup
   39: iconst_1
   40: getstatic   #23         // Field Service:LEItemDataType;
   43: aastore
   44: putstatic   #25         // Field ENUM$VALUES:[LEItemDataType;
   47: return

 public int getValue();
  Code:
    0: aload_0
    1: getfield   #32         // Field value:I
    4: ireturn

 public static EItemDataType valueOf(int);
  Code:
    0: iload_0
    1: tableswitch  { // 1 to 2
           1: 24
           2: 28
        default: 32
     }
   24: getstatic   #20         // Field Real:LEItemDataType;
   27: areturn
   28: getstatic   #23         // Field Service:LEItemDataType;
   31: areturn
   32: aconst_null
   33: areturn

 public static EItemDataType[] values();
  Code:
    0: getstatic   #25         // Field ENUM$VALUES:[LEItemDataType;
    3: dup
    4: astore_0
    5: iconst_0
    6: aload_0
    7: arraylength
    8: dup
    9: istore_1
   10: anewarray   #1         // class EItemDataType
   13: dup
   14: astore_2
   15: iconst_0
   16: iload_1
   17: invokestatic #42         // Method java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V
   20: aload_2
   21: areturn

 public static EItemDataType valueOf(java.lang.String);
  Code:
    0: ldc      #1         // class EItemDataType
    2: aload_0
    3: invokestatic #49         // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
    6: checkcast   #1         // class EItemDataType
    9: areturn
}

是个final类型的,不允许继承自其它类型

继承了java.lang.Enum类,更说明这个枚举就是个class

public final class EItemDataType extends java.lang.Enum<EItemDataType> {

所有的枚举值都被定义成静态值了,且以常量形式存在

public static final EItemDataType Real;

再看下一个特殊的方法,由于枚举继承了java.lang.Enum这个类,那么它自然拥有一些实用的方法:

public static EItemDataType valueOf(java.lang.String);