如何在编译期间翻译枚举以及如何创建对象

时间:2011-12-23 20:17:32

标签: java enums

enum icecream {
    vanilla(100), strawberry(20);
    int price;

    icecream(int i) {
        price = i;
    }

}

我对编译时如何创建枚举对象感到有点困惑

我看到了一些他们像这样提到的例子

public enum Flavor
{
    COFFEE, VANILLA, CHOCOLATE, STRAWBERRY, RUM_RAISIN, PEACH
}

这被翻译成(在编译期间)

public final class Flavor
extends java.lang.Enum
{
    public static final Flavor COFFEE = new Flavor("COFFEE", 0);
    public static final Flavor VANILLA = new Flavor("VANILLA", 1);
    // ...
}

链接:http://www.kdgregory.com/index.php?page=java.enum

但是当我将值与名称一起传递给我时,如何创建对象,它们看起来就像是方法调用。 E.x.香草(100)这里的香草,价格是100,但它是如何创建的?我根本没有得到它。请帮忙:(

2 个答案:

答案 0 :(得分:1)

java编译器将枚举作为常量读取,但最终,它们像任何其他对象一样实现(也就是说,它们不是特殊类型,如ints / floats / arrays,而是纯粹对象的语法包装器面向语言特征)。因此,枚举具有可以覆盖的构造函数,因此静态枚举不仅仅具有名称。这可能非常有用,例如,如果您希望枚举值具有多个字段。

例如,我可能有一个动物枚举,每个动物都有一个名字,以及一些腿:

public enum Animal{
 Dog(4), Baboon(2);

 public int legs;

 private Animal(int legs) {
   legs=legs;
 }
}

但是,如果没有这样的覆盖,编译器会生成默认的枚举对象,这实际上就是您粘贴的内容。

答案 1 :(得分:1)

vanilla(100), strawberry(20)只是一个java5 +表示法。它在编译期间被翻译成适当的对象创建代码:

public static final icecream vanilla = new icecream(100);
public static final icecream strawberry = new icecream(20);

BTW,java类型应该是CamelCased,因此,icecream应该命名为IceCream