是否有可能在java中创建Enum类型的对象?

问题描述:

我在项目工作中发现了这种类型的代码。 该存储库工作得很好......但是当我试图通过独立的测试运行来了解代码......给出错误!!!是否有可能在java中创建Enum类型的对象?

public enum Fruits { 
    static { 
     APPLE= new Fruits("APPLE", 0); 
     BANANA = new Fruits("BANANA", 1); 
     // and so on. 
    } 
} 

我无法理解调用内部枚举枚举的构造函数的意义,太不宣的构造函数。

+0

请详细说明,发布您的错误 – Frank

+0

至少是足够完整的编译后编码。 –

我的猜测是这是实际上是反编译真实代码的产物。这不是有效的Java源代码,但实际上是什么,编译器会为你创建的枚举:当你想添加更多参数

public enum Fruits { 
    APPLE, BANANA; 
} 
+0

只是想知道,在反编译的代码中也应该有一个构造函数声明。 –

+0

@MarkoTopolnik:是的,我希望如此。 OP从哪里获得这些代码或者是否有更多的代码并不清楚。 –

+0

你把它非常正确的代码WAS反编译。 我已反编译存储库... 谢谢...... :) – sid15g

public enum Fruits { 
     APPLE("APPLE", 0), BANANA("BANANA", 1); 
     String text; 
     int value; 
     private Fruits(String text, int value){ 
      this.text = text; 
      this.value = value; 
     } 
     public String getText(){ 
      return text; 
     } 
     public int getValue(){ 
      return value; 
     } 
    } 

这个概念是非常有用的。

+1

实际上,这些是隐式枚举成员构造函数的参数。他们设置*名称*和*序号*属性。 –

+1

是的这些属性都可以在所有枚举上自动获得。将它们包含在构造函数中完全浪费时间。 –

+0

同意但这有助于理解构造函数和值检索的概念。如果OP想要在构造函数中添加更多参数,它将非常有用 –

像往常一样@ JonSkeets的直觉胜出。编译他提供的代码:

public enum Fruits { 
    APPLE, BANANA; 
} 

反编译与jad然后得出:

public final class Fruits extends Enum 
{ 

    public static Fruits[] values() 
    { 
     return (Fruits[])$VALUES.clone(); 
    } 

    public static Fruits valueOf(String s) 
    { 
     return (Fruits)Enum.valueOf(Fruits, s); 
    } 

    private Fruits(String s, int i) 
    { 
     super(s, i); 
    } 

    public static final Fruits APPLE; 
    public static final Fruits BANANA; 
    private static final Fruits $VALUES[]; 

    static 
    { 
     APPLE = new Fruits("APPLE", 0); 
     BANANA = new Fruits("BANANA", 1); 
     $VALUES = (new Fruits[] { 
      APPLE, BANANA 
     }); 
    } 
} 

完整的例子说明了所有的编译器为你做的工作,当你声明枚举。请注意,正如@MarkoTopolnik指出的那样,你不能自己做这件事,因为编译器不会允许它。

+0

@MarkoTopolnik良好的捕获;看我的编辑。 –