[英]Why does Java allow code blocks for enum constants?
我突然間輸入了口袋妖怪類型的枚舉
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
, 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
的文件,它是這個子類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.