为什么Java允许枚举常量的代码块?

时间:2014-12-10 07:43:37

标签: java enums

突然

我正在输入口袋妖怪类型的枚举
public enum Type {

    NORMAL () { // This is the question. Why does Java allow this?
        int x = 10; // Only accepts variables?
    };

    Type () {}

}

此代码编译正确。

对于常量使用代码块是什么?

2 个答案:

答案 0 :(得分:10)

枚举中的代码块允许您覆盖枚举类型中定义的方法。例如

enum Foo {
    PEAR,
    BANANA() {
        @Override
        public void doFoo() {
            System.out.println("Banana foo");
        }
    },
    APPLE,
    GRAPE;

    public void doFoo() {
        System.out.println("Default foo");
    }
}

此处Foo.BANANA.doFoo()会产生"Banana foo",而在任何其他doFoo()上调用Foo会产生"Default foo"

答案 1 :(得分:2)

在Java中,枚举不是整数的简单别名,就像许多其他编程语言一样。在Java中,枚举值是完整的对象,可以包含用户定义的数据,方法等。

如果您按如下方式编写枚举类:

enum PetType { CAT, GOLDFISH }

实际发生的是你定义了一个类PetType(它是标准Java类Enum的子类)和这个类的两个实例,CAT和{{1} }。 Java编译器确保永远不会有更多GOLDFISH个实例,并且PetTypeCAT始终引用同一个对象。

但除此之外GOLDFISH是正常的类。您可以为它定义成员变量和方法,您可以通过构造函数初始化它们:

MyEnum

您可以在自己的代码中使用:

enum PetType {
    CAT(true),
    GOLDFISH(false);

    private boolean isHairy;

    PetType(boolean isHairy) {
        this.isHairy = isHairy;
    }

    public boolean isHairy() {
        return isHairy;
    }
}

这就是你可以在枚举定义中使用代码的原因。

你在代码中所做的基本上是定义public static void displayWhetherHairy(CatType catType) { if (catType.isHairy()) { System.out.println("This pet is hairy!"); } else { System.out.println("This pet is not hairy!"); } } 类的另一个(匿名)子类,它定义了一个值为10的附加成员变量Type。这个子类的唯一实例是{ {1}}对象。如果您编译代码,您将看到x形式的文件,这是该子类。