在java中,这样的枚举类型编译成什么?

ove*_*nge 14 java enums enumeration java-8

下面是定义枚举类型的代码.

enum Company{
    EBAY(30), PAYPAL(10), GOOGLE(15), YAHOO(20), ATT(25);
    private int value;

    private Company(int value){
        super(this.name()); 
        this.value = value;
    }

    public int getValue(){
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

内部编译到,

final class Company extends Enum<Company>{
    public final static Company EBAY = new Company(30);
    public final static Company PAYPAL = new Company(10);
    public final static Company GOOGLE = new Company(15);
    public final static Company YAHOO = new Company(20);
    public final static Company ATT = new Company(25);

    private int value;

    private Company(int value){
        super(this.name(),Enum.valueOf(Company.class, this.name()));
        this.value = value;
    }

    public int getValue(){
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的理解是否正确?

Ell*_*sch 9

功能上,是的.字面上没有(你不能明确地Enum为一件事子类).enum(s)有一个toString.并且您的enum代码无效(您无法调用super())并且getValue需要返回类型.

enum Company{
    EBAY(30), PAYPAL(10), GOOGLE(15), YAHOO(20), ATT(25);
    private int value;

    private Company(int value){
        this.value = value;
    }

    public int getValue(){
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)


Fil*_*vic 5

如果删除super非法调用并且this.name作为 super 的参数也是非法的,请编译它并在类上运行 javap,这是输出:

$ /usr/lib/jvm/java-7-oracle/bin/javap -p Company.class 
Compiled from "Company.java"
final class Company extends java.lang.Enum<Company> {
  public static final Company EBAY;
  public static final Company PAYPAL;
  public static final Company GOOGLE;
  public static final Company YAHOO;
  public static final Company ATT;
  private int value;
  private static final Company[] $VALUES;
  public static Company[] values();
  public static Company valueOf(java.lang.String);
  private Company(int);
  public int getValue();
  static {};
}
Run Code Online (Sandbox Code Playgroud)

这是静态的字节码,它的一部分

static {};
  flags: ACC_STATIC
  LineNumberTable:
    line 2: 0
    line 1: 75
  Code:
    stack=5, locals=0, args_size=0
       0: new           #4                  // class Company
       3: dup           
       4: ldc           #8                  // String EBAY
       6: iconst_0      
       7: bipush        30
       9: invokespecial #9                  // Method "<init>":(Ljava/lang/String;II)V
      12: putstatic     #10                 // Field EBAY:LCompany;
Run Code Online (Sandbox Code Playgroud)