2017-04-03 72 views
-3

據我的理解,Java枚舉不可擴展。所以我想知道爲什麼枚舉不是最終的定義。只是爲了確保我明白了一切我看看到JLS 8,發現如下senentece:枚舉的繼承

枚舉聲明是隱式最後,除非它包含具有類體至少一個枚舉常數(§8.9 0.1)。

這是否意味着我可以創建一個可擴展的枚舉常量,例如,自己的方法聲明,字段,靜態或對象初始值設定項?

到目前爲止,我還沒有找到一種方法讓我得出結論,即枚舉可能總是隱含地最終結論。我錯在哪裏?

+3

JLS的第8.9.1節告訴你什麼? (因爲這是在你發佈的引用中) - (我引用它:「enum常量的可選類主體隱式定義了一個匿名類聲明(第15.9.5節),它擴展了直接封裝的枚舉類型。類體是由匿名類的常規規則管理的,特別是它不能包含任何構造函數。在這些類體中聲明的實例方法只能在封閉枚舉類型中覆蓋可訪問的方法時纔可以在封閉枚舉類型外部調用(第8.4節)。 8)。「) –

回答

7

正如描述所說,枚舉常量可以擁有自己的主體,其中在枚舉本身中定義的方法被覆蓋。例如:

public enum ExampleEnum { 

    ONE, 

    TWO { 
     @Override 
     public void print() { 
      System.out.println("Two"); 
     } 
    }; 

    public void print() { 
     System.out.println(name()); 
    } 
} 

在這個例子中,恆定TWO具有其自己的身體與print()方法的重寫版本。

請注意,不可能在枚舉本身之外擴展enum

+5

你甚至可以使打印方法摘要強制每個枚舉實現它(以防萬一需要這樣的事情)。 – Eugene