2017-04-03 14 views
-3

私の理解では、Javaの列挙型は拡張できません。だから私はenumがなぜ定義されていないのだろうと思った。 (§8.9それはクラス本体を有する少なくとも1つの列挙型定数を含まない限り列挙型の継承

列挙型の宣言が暗黙のうちに最終的なもの:ちょうど私はすべて私がJLS 8に見ていたし、次のsenenteceを発見し理解していることを確認します.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()); 
    } 
} 

、定数TWOprint()メソッドのオーバーライドされたバージョンで独自本体を有します。

enumを列挙型自体の外側に拡張することはできません。

+5

あなたはprintメソッドを抽象化して、すべてのenumに強制的に実装させることさえできます(そのようなことが必要な場合に備えて)。 – Eugene