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

为什么Java允许枚举常量使用代码块?,java,enums,Java,Enums,我正在键入口袋妖怪类型的枚举,突然 public enum Type { NORMAL () { // This is the question. Why does Java allow this? int x = 10; // Only accepts variables? }; Type () {} } 这段代码编译正确 常量的代码块有什么用?枚举中的代码块允许您重写枚举类型中定义的方法。比如说 enum Foo { PEAR,

我正在键入口袋妖怪类型的枚举,突然

public enum Type {

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

    Type () {}

}
这段代码编译正确


常量的代码块有什么用?

枚举中的代码块允许您重写枚举类型中定义的方法。比如说

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”

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

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

enum PetType { CAT, GOLDFISH }
实际上,您定义了一个类
PetType
(它是标准Java类
Enum
的子类)和这个类的两个实例,
CAT
GOLDFISH
。Java编译器确保永远不会有更多的
PetType
实例,并且
CAT
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的额外成员变量
x
。该子类的唯一实例是
NORMAL
对象。如果您编译代码,您将看到一个格式为
Type$1.class
的文件,这就是这个子类。

看看“行星”——例如:看看它有什么用处。