Kotlin中enum枚举的使用

枚举

在kotlin中,枚举相当于是一个静态的变量。虽然是以class的信使编写和定义,但是不能实例化。

枚举的使用

enum class TestClass {
    A{
        override var value = TestClassA("AA")
        override fun test() {
            println("test called ${value.name}")
        }
    };

    open var value:TestClassA = TestClassA("null")
    open abstract fun test():Unit

}

fun main(args:Array<String>){
    println(TestClass.A.value)

}

以上代码是一个很简单的实例,我们来看看他相对应的字节码文件。

// ================com/eathemeat/cabinetflow/TestClassA.class =================
// class version 52.0 (52)
// access flags 0x31
public final class com/eathemeat/cabinetflow/TestClassA {


  // access flags 0x12
  private final Ljava/lang/String; name
  @Lorg/jetbrains/annotations/NotNull;() // invisible

  // access flags 0x11
  public final getName()Ljava/lang/String;
  @Lorg/jetbrains/annotations/NotNull;() // invisible
   L0
    LINENUMBER 4 L0
    ALOAD 0
    GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
    ARETURN
   L1
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClassA; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x1
  public <init>(Ljava/lang/String;)V
    // annotable parameter count: 1 (visible)
    // annotable parameter count: 1 (invisible)
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
   L0
    ALOAD 1
    LDC "name"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
   L1
    LINENUMBER 4 L1
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    ALOAD 0
    ALOAD 1
    PUTFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
    RETURN
   L2
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClassA; L0 L2 0
    LOCALVARIABLE name Ljava/lang/String; L0 L2 1
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x11
  public final component1()Ljava/lang/String;
  @Lorg/jetbrains/annotations/NotNull;() // invisible
   L0
    ALOAD 0
    GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
    ARETURN
   L1
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClassA; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x11
  public final copy(Ljava/lang/String;)Lcom/eathemeat/cabinetflow/TestClassA;
  @Lorg/jetbrains/annotations/NotNull;() // invisible
    // annotable parameter count: 1 (visible)
    // annotable parameter count: 1 (invisible)
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
   L0
    ALOAD 1
    LDC "name"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
    NEW com/eathemeat/cabinetflow/TestClassA
    DUP
    ALOAD 1
    INVOKESPECIAL com/eathemeat/cabinetflow/TestClassA.<init> (Ljava/lang/String;)V
    ARETURN
   L1
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClassA; L0 L1 0
    LOCALVARIABLE name Ljava/lang/String; L0 L1 1
    MAXSTACK = 3
    MAXLOCALS = 2

  // access flags 0x1009
  public static synthetic copy$default(Lcom/eathemeat/cabinetflow/TestClassA;Ljava/lang/String;ILjava/lang/Object;)Lcom/eathemeat/cabinetflow/TestClassA;
    ILOAD 2
    ICONST_1
    IAND
    IFEQ L0
    ALOAD 0
    GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
    ASTORE 1
   L0
    ALOAD 0
    ALOAD 1
    INVOKEVIRTUAL com/eathemeat/cabinetflow/TestClassA.copy (Ljava/lang/String;)Lcom/eathemeat/cabinetflow/TestClassA;
    ARETURN
    MAXSTACK = 2
    MAXLOCALS = 4

  // access flags 0x1
  public toString()Ljava/lang/String;
  @Lorg/jetbrains/annotations/NotNull;() // invisible
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
    LDC "TestClassA(name="
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ALOAD 0
    GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    LDC ")"
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ARETURN
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x1
  public hashCode()I
    ALOAD 0
    GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
    DUP
    IFNULL L0
    INVOKEVIRTUAL java/lang/Object.hashCode ()I
    GOTO L1
   L0
    POP
    ICONST_0
   L1
    IRETURN
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x1
  public equals(Ljava/lang/Object;)Z
    @Lorg/jetbrains/annotations/Nullable;() // invisible, parameter 0
    ALOAD 0
    ALOAD 1
    IF_ACMPEQ L0
    ALOAD 1
    INSTANCEOF com/eathemeat/cabinetflow/TestClassA
    IFEQ L1
    ALOAD 1
    CHECKCAST com/eathemeat/cabinetflow/TestClassA
    ASTORE 2
    ALOAD 0
    GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
    ALOAD 2
    GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.areEqual (Ljava/lang/Object;Ljava/lang/Object;)Z
    IFEQ L1
   L0
    ICONST_1
    IRETURN
   L1
    ICONST_0
    IRETURN
    MAXSTACK = 2
    MAXLOCALS = 3

  @Lkotlin/Metadata;(mv={1, 6, 0}, k=1, d1={"\u0000\"\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0002\u0008\u0006\n\u0002\u0010\u000b\n\u0002\u0008\u0002\n\u0002\u0010\u0008\n\u0002\u0008\u0002\u0008\u0086\u0008\u0018\u00002\u00020\u0001B\r\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u00a2\u0006\u0002\u0010\u0004J\u0009\u0010\u0007\u001a\u00020\u0003H\u00c6\u0003J\u0013\u0010\u0008\u001a\u00020\u00002\u0008\u0008\u0002\u0010\u0002\u001a\u00020\u0003H\u00c6\u0001J\u0013\u0010\u0009\u001a\u00020\n2\u0008\u0010\u000b\u001a\u0004\u0018\u00010\u0001H\u00d6\u0003J\u0009\u0010\u000c\u001a\u00020\rH\u00d6\u0001J\u0009\u0010\u000e\u001a\u00020\u0003H\u00d6\u0001R\u0011\u0010\u0002\u001a\u00020\u0003\u00a2\u0006\u0008\n\u0000\u001a\u0004\u0008\u0005\u0010\u0006\u00a8\u0006\u000f"}, d2={"Lcom/eathemeat/cabinetflow/TestClassA;", "", "name", "", "(Ljava/lang/String;)V", "getName", "()Ljava/lang/String;", "component1", "copy", "equals", "", "other", "hashCode", "", "toString", "app_debug"})
  // compiled from: Wahhhhh.kt
}


// ================com/eathemeat/cabinetflow/TestClass.class =================
// class version 52.0 (52)
// access flags 0x4421
// signature Ljava/lang/Enum<Lcom/eathemeat/cabinetflow/TestClass;>;
// declaration: com/eathemeat/cabinetflow/TestClass extends java.lang.Enum<com.eathemeat.cabinetflow.TestClass>
public abstract enum com/eathemeat/cabinetflow/TestClass extends java/lang/Enum {


  // access flags 0x4019
  public final static enum Lcom/eathemeat/cabinetflow/TestClass; A

  // access flags 0x8
  static <clinit>()V
    ICONST_1
    ANEWARRAY com/eathemeat/cabinetflow/TestClass
    DUP
    DUP
    ICONST_0
    NEW com/eathemeat/cabinetflow/TestClass$A
    DUP
    LDC "A"
    ICONST_0
    INVOKESPECIAL com/eathemeat/cabinetflow/TestClass$A.<init> (Ljava/lang/String;I)V
    DUP
    PUTSTATIC com/eathemeat/cabinetflow/TestClass.A : Lcom/eathemeat/cabinetflow/TestClass;
    AASTORE
    PUTSTATIC com/eathemeat/cabinetflow/TestClass.$VALUES : [Lcom/eathemeat/cabinetflow/TestClass;
    RETURN
    MAXSTACK = 8
    MAXLOCALS = 0

  // access flags 0x101A
  private final static synthetic [Lcom/eathemeat/cabinetflow/TestClass; $VALUES

  // access flags 0x2
  private Lcom/eathemeat/cabinetflow/TestClassA; value
  @Lorg/jetbrains/annotations/NotNull;() // invisible

  // access flags 0x1
  public getValue()Lcom/eathemeat/cabinetflow/TestClassA;
  @Lorg/jetbrains/annotations/NotNull;() // invisible
   L0
    LINENUMBER 14 L0
    ALOAD 0
    GETFIELD com/eathemeat/cabinetflow/TestClass.value : Lcom/eathemeat/cabinetflow/TestClassA;
    ARETURN
   L1
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x1
  public setValue(Lcom/eathemeat/cabinetflow/TestClassA;)V
    // annotable parameter count: 1 (visible)
    // annotable parameter count: 1 (invisible)
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
   L0
    ALOAD 1
    LDC "<set-?>"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
   L1
    LINENUMBER 14 L1
    ALOAD 0
    ALOAD 1
    PUTFIELD com/eathemeat/cabinetflow/TestClass.value : Lcom/eathemeat/cabinetflow/TestClassA;
    RETURN
   L2
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass; L0 L2 0
    LOCALVARIABLE <set-?> Lcom/eathemeat/cabinetflow/TestClassA; L0 L2 1
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x401
  public abstract test()V
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass; L0 L1 0

  // access flags 0x2
  // signature ()V
  // declaration: void <init>()
  private <init>(Ljava/lang/String;I)V
   L0
    LINENUMBER 6 L0
    ALOAD 0
    ALOAD 1
    ILOAD 2
    INVOKESPECIAL java/lang/Enum.<init> (Ljava/lang/String;I)V
   L1
    LINENUMBER 14 L1
    ALOAD 0
    NEW com/eathemeat/cabinetflow/TestClassA
    DUP
    LDC "null"
    INVOKESPECIAL com/eathemeat/cabinetflow/TestClassA.<init> (Ljava/lang/String;)V
    PUTFIELD com/eathemeat/cabinetflow/TestClass.value : Lcom/eathemeat/cabinetflow/TestClassA;
    RETURN
   L2
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass; L0 L2 0
    LOCALVARIABLE $enum$name Ljava/lang/String; L0 L2 1
    LOCALVARIABLE $enum$ordinal I L0 L2 2
    MAXSTACK = 4
    MAXLOCALS = 3

  // access flags 0x1001
  public synthetic <init>(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
   L0
    LINENUMBER 6 L0
    ALOAD 0
    ALOAD 1
    ILOAD 2
    INVOKESPECIAL com/eathemeat/cabinetflow/TestClass.<init> (Ljava/lang/String;I)V
    RETURN
   L1
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass; L0 L1 0
    LOCALVARIABLE $enum$name Ljava/lang/String; L0 L1 1
    LOCALVARIABLE $enum$ordinal I L0 L1 2
    LOCALVARIABLE $constructor_marker Lkotlin/jvm/internal/DefaultConstructorMarker; L0 L1 3
    MAXSTACK = 3
    MAXLOCALS = 4

  // access flags 0x9
  public static values()[Lcom/eathemeat/cabinetflow/TestClass;
    GETSTATIC com/eathemeat/cabinetflow/TestClass.$VALUES : [Lcom/eathemeat/cabinetflow/TestClass;
    INVOKEVIRTUAL [Lcom/eathemeat/cabinetflow/TestClass;.clone ()Ljava/lang/Object;
    CHECKCAST [Lcom/eathemeat/cabinetflow/TestClass;
    ARETURN
    MAXSTACK = 1
    MAXLOCALS = 0

  // access flags 0x9
  public static valueOf(Ljava/lang/String;)Lcom/eathemeat/cabinetflow/TestClass;
    LDC Lcom/eathemeat/cabinetflow/TestClass;.class
    ALOAD 0
    INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
    CHECKCAST com/eathemeat/cabinetflow/TestClass
    ARETURN
    MAXSTACK = 2
    MAXLOCALS = 1

  @Lkotlin/Metadata;(mv={1, 6, 0}, k=1, d1={"\u0000\u001c\n\u0002\u0018\u0002\n\u0002\u0010\u0010\n\u0002\u0008\u0002\n\u0002\u0018\u0002\n\u0002\u0008\u0005\n\u0002\u0010\u0002\n\u0002\u0008\u0002\u0008\u0086\u0001\u0018\u00002\u0008\u0012\u0004\u0012\u00020\u00000\u0001B\u0007\u0008\u0002\u00a2\u0006\u0002\u0010\u0002J\u0008\u0010\u0009\u001a\u00020\nH&R\u001a\u0010\u0003\u001a\u00020\u0004X\u0096\u000e\u00a2\u0006\u000e\n\u0000\u001a\u0004\u0008\u0005\u0010\u0006\"\u0004\u0008\u0007\u0010\u0008j\u0002\u0008\u000b\u00a8\u0006\u000c"}, d2={"Lcom/eathemeat/cabinetflow/TestClass;", "", "(Ljava/lang/String;I)V", "value", "Lcom/eathemeat/cabinetflow/TestClassA;", "getValue", "()Lcom/eathemeat/cabinetflow/TestClassA;", "setValue", "(Lcom/eathemeat/cabinetflow/TestClassA;)V", "test", "", "A", "app_debug"})
  // access flags 0x18
  final static INNERCLASS com/eathemeat/cabinetflow/TestClass$A com/eathemeat/cabinetflow/TestClass A
  // compiled from: Wahhhhh.kt
}


// ================com/eathemeat/cabinetflow/TestClass$A.class =================
// class version 52.0 (52)
// access flags 0x30
final class com/eathemeat/cabinetflow/TestClass$A extends com/eathemeat/cabinetflow/TestClass {


  // access flags 0x2
  private Lcom/eathemeat/cabinetflow/TestClassA; value
  @Lorg/jetbrains/annotations/NotNull;() // invisible

  // access flags 0x1
  public getValue()Lcom/eathemeat/cabinetflow/TestClassA;
  @Lorg/jetbrains/annotations/NotNull;() // invisible
   L0
    LINENUMBER 8 L0
    ALOAD 0
    GETFIELD com/eathemeat/cabinetflow/TestClass$A.value : Lcom/eathemeat/cabinetflow/TestClassA;
    ARETURN
   L1
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass$A; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x1
  public setValue(Lcom/eathemeat/cabinetflow/TestClassA;)V
    // annotable parameter count: 1 (visible)
    // annotable parameter count: 1 (invisible)
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
   L0
    ALOAD 1
    LDC "<set-?>"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
   L1
    LINENUMBER 8 L1
    ALOAD 0
    ALOAD 1
    PUTFIELD com/eathemeat/cabinetflow/TestClass$A.value : Lcom/eathemeat/cabinetflow/TestClassA;
    RETURN
   L2
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass$A; L0 L2 0
    LOCALVARIABLE <set-?> Lcom/eathemeat/cabinetflow/TestClassA; L0 L2 1
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1
  public test()V
   L0
    LINENUMBER 10 L0
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
    LDC "test called "
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ALOAD 0
    INVOKEVIRTUAL com/eathemeat/cabinetflow/TestClass$A.getValue ()Lcom/eathemeat/cabinetflow/TestClassA;
    INVOKEVIRTUAL com/eathemeat/cabinetflow/TestClassA.getName ()Ljava/lang/String;
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ASTORE 1
   L1
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
   L2
   L3
    LINENUMBER 11 L3
    RETURN
   L4
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass$A; L0 L4 0
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x0
  // signature ()V
  // declaration: void <init>()
  <init>(Ljava/lang/String;I)V
   L0
    LINENUMBER 7 L0
    ALOAD 0
    ALOAD 1
    ILOAD 2
    ACONST_NULL
    INVOKESPECIAL com/eathemeat/cabinetflow/TestClass.<init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
   L1
    LINENUMBER 8 L1
    ALOAD 0
    NEW com/eathemeat/cabinetflow/TestClassA
    DUP
    LDC "AA"
    INVOKESPECIAL com/eathemeat/cabinetflow/TestClassA.<init> (Ljava/lang/String;)V
    PUTFIELD com/eathemeat/cabinetflow/TestClass$A.value : Lcom/eathemeat/cabinetflow/TestClassA;
    RETURN
   L2
    LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass$A; L0 L2 0
    LOCALVARIABLE $enum$name Ljava/lang/String; L0 L2 1
    LOCALVARIABLE $enum$ordinal I L0 L2 2
    MAXSTACK = 4
    MAXLOCALS = 3

  @Lkotlin/Metadata;(mv={1, 6, 0}, k=1, d1={"\u0000\u0018\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\u0008\u0005\n\u0002\u0010\u0002\n\u0000\u0008\u00c6\u0001\u0018\u00002\u00020\u0001J\u0008\u0010\u0008\u001a\u00020\u0009H\u0016R\u001a\u0010\u0002\u001a\u00020\u0003X\u0096\u000e\u00a2\u0006\u000e\n\u0000\u001a\u0004\u0008\u0004\u0010\u0005\"\u0004\u0008\u0006\u0010\u0007\u00a8\u0006\n"}, d2={"Lcom/eathemeat/cabinetflow/TestClass$A;", "Lcom/eathemeat/cabinetflow/TestClass;", "value", "Lcom/eathemeat/cabinetflow/TestClassA;", "getValue", "()Lcom/eathemeat/cabinetflow/TestClassA;", "setValue", "(Lcom/eathemeat/cabinetflow/TestClassA;)V", "test", "", "app_debug"})
  // access flags 0x18
  final static INNERCLASS com/eathemeat/cabinetflow/TestClass$A com/eathemeat/cabinetflow/TestClass A
  // compiled from: Wahhhhh.kt
}


// ================com/eathemeat/cabinetflow/WahhhhhKt.class =================
// class version 52.0 (52)
// access flags 0x31
public final class com/eathemeat/cabinetflow/WahhhhhKt {


  // access flags 0x19
  public final static main([Ljava/lang/String;)V
    // annotable parameter count: 1 (visible)
    // annotable parameter count: 1 (invisible)
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
   L0
    ALOAD 0
    LDC "args"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
   L1
    LINENUMBER 20 L1
    GETSTATIC com/eathemeat/cabinetflow/TestClass.A : Lcom/eathemeat/cabinetflow/TestClass;
    INVOKEVIRTUAL com/eathemeat/cabinetflow/TestClass.getValue ()Lcom/eathemeat/cabinetflow/TestClassA;
    ASTORE 1
   L2
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
   L3
   L4
    LINENUMBER 22 L4
    RETURN
   L5
    LOCALVARIABLE args [Ljava/lang/String; L0 L5 0
    MAXSTACK = 2
    MAXLOCALS = 2

  @Lkotlin/Metadata;(mv={1, 6, 0}, k=2, d1={"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\u0008\u0002\u001a\u0019\u0010\u0000\u001a\u00020\u00012\u000c\u0010\u0002\u001a\u0008\u0012\u0004\u0012\u00020\u00040\u0003\u00a2\u0006\u0002\u0010\u0005\u00a8\u0006\u0006"}, d2={"main", "", "args", "", "", "([Ljava/lang/String;)V", "app_debug"})
  // compiled from: Wahhhhh.kt
}


// ================META-INF/app_debug.kotlin_module =================

&
com.eathemeat.cabinetflow	WahhhhhKt"*


其中有几段的代码比较重要:

  • 在使用枚举的时候:
    LINENUMBER 20 L1
    GETSTATIC com/eathemeat/cabinetflow/TestClass.A : Lcom/eathemeat/cabinetflow/TestClass;
    INVOKEVIRTUAL com/eathemeat/cabinetflow/TestClass.getValue ()Lcom/eathemeat/cabinetflow/TestClassA;
    ASTORE 1
   L2
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
   L3
   L4

可以看到上面的代码中使用了GETSTATIC,其作用是从类中获取静态字段。所以可以认为,枚举是在这个类中的静态字段,在程序启动的时候就有了。

  • 枚举的定义(实例化)
    LINENUMBER 7 L0
    ALOAD 0
    ALOAD 1
    ILOAD 2
    ACONST_NULL
    INVOKESPECIAL com/eathemeat/cabinetflow/TestClass.<init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
   L1


上面的代码是TestClass.A的实例化的代码。其中有意思的是如果代码写成这样:

enum class TestClassB(val cls:TestClass) {
    A(TestClass("AA"))
}

相对应的字节码的代码:

    LINENUMBER 20 L0
    NEW com/eathemeat/cabinetflow/TestClass
    DUP
    LDC "AA"
    INVOKESPECIAL com/eathemeat/cabinetflow/TestClass.<init> (Ljava/lang/String;)V
    INVOKESPECIAL com/eathemeat/cabinetflow/TestClassB.<init> (Ljava/lang/String;ILcom/eathemeat/cabinetflow/TestClass;)V
    DUP
    PUTSTATIC com/eathemeat/cabinetflow/TestClassB.A : Lcom/eathemeat/cabinetflow/TestClassB;
    AASTORE
    PUTSTATIC com/eathemeat/cabinetflow/TestClassB.$VALUES : [Lcom/eathemeat/cabinetflow/TestClassB;
    RETURN

但是这种写法虽然创建了TestClass的的实力,却没有把这个实例和其他的关联起来,导致这个实例没有使用到,也拿不到这个实例的引用。猜想可能是为了之前的用法,把参数传进去。

如果想要简单的使用一个类的实例来代替枚举中的枚举项按照你现如今的做法貌似做不到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值