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

4

我正在输入一个宝可梦类型的枚举时,突然

public enum Type {

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

    Type () {}

}

这段代码编译正确。

常量代码块有什么用处?


请查看“planet”示例:https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html,了解它的实用性。 - Joachim Rohde
2个回答

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",而在任何其他Foo上调用doFoo()将产生"Default foo"


2
在Java中,枚举不像许多其他编程语言中那样是整数的简单别名。在Java中,枚举值是完整的对象,可以具有用户定义的数据、方法等。
如果您按照以下方式编写枚举类:
enum PetType { CAT, GOLDFISH }

实际上,您定义了一个类PetType(它是标准Java类Enum的子类)和该类的两个实例CATGOLDFISH。Java编译器确保不会有更多的PetType实例,并且CATGOLDFISH始终引用同一对象。
除此之外,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!");
    }
}

这就是为什么您可以在枚举定义中使用代码的原因。

您在代码中所做的基本上是定义Type类的另一个(匿名)子类,该子类定义了一个附加的成员变量x,其值为10。这个子类的唯一实例是NORMAL对象。如果您编译您的代码,您将会看到一个形式为Type$1.class的文件,这就是这个子类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接