簡體   English   中英

為什么Java允許枚舉常量的代碼塊?

[英]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的子類)和這個類的兩個實例, CATGOLDFISH Java編譯器確保永遠不會有更多的PetType實例,並且CATGOLDFISH總是引用同一個對象。

MyEnumMyEnum是一個普通的課程。 您可以為它定義成員變量和方法,您可以通過構造函數初始化它們:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM