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

时间:2012-11-10 15:22:09

标签: java

我在项目工作期间在存储库中发现了这种类型的代码。 该存储库运行良好......但是当我试图通过独立的测试运行来理解代码时...给出错误!!!

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

我无法理解在enum中调用枚举的构造函数的含义,也没有声明构造函数。

3 个答案:

答案 0 :(得分:6)

我的猜测是,实际上是反编译实际代码的产物。这不是有效的Java源代码,但实际上是编译器将为您创建的枚举:

public enum Fruits {
    APPLE, BANANA;
}

答案 1 :(得分:4)

像往常一样@ 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指出的那样,你不能自己做,只是因为编译器不允许这样做。

答案 2 :(得分:-1)

    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;
        }
    }

当您希望添加更多参数时,此概念非常有用。