web-dev-qa-db-ja.com

Java列挙型を最終的にできないのはなぜですか?

public interface Proposal  {  
    public static final enum STATUS { 
        NEW ,
        START ,
        CONTINUE ,
        SENTTOCLIENT
    }; 
}

Javaでは、列挙型をインターフェース内でfinalにすることはできませんが、デフォルトでは、インターフェース内のすべてのデータメンバーはpublic static finalです。誰かがこれを明確にすることができますか?

23
Zuned Ahmed

コンパイラーは、プログラマーが実装を明示的に定義した列挙型エントリーごとにサブクラスを生成するため、列挙型を最終にすることはできません。

さらに、インスタンスが独自のクラス本体を持たない列挙型は、 JLSセクション8.9 によって暗黙的に最終になります。

27
Eugene Kuleshov

Javaでは、enum型を拡張するクラスを作成することはできません。したがって、列挙型自体は常に最終的なものであるため、finalキーワードを使用する必要はありません。

もちろん、ある意味では、enumsは最終的なものではありません。これは、列挙型記述子内の各フィールドに匿名のサブクラスを定義できるためです。しかし、finalキーワードを使用してこれらのタイプの説明を防ぐことはあまり意味がありません。なぜなら、人々は同じ.Javaファイル内にこれらのサブクラスを作成する必要があり、それを行う権限を持つ人は誰でも同じように作成できるからです。 finalキーワードは簡単に削除できます。誰かが他のパッケージで列挙型を拡張するリスクはありません。

32

2つのこと:

  1. 列挙型はJava.lang.Enumの最後のサブクラスです
  2. 列挙型がクラスのメンバーである場合、それは暗黙的に静的です
7
robertvoliva

列挙型の最終を宣言しても意味がありません。クラスのファイナルは、それらを継承できないことを意味します。ただし、列挙型はデフォルトでは継承できません(つまり、最終的なものです)。

最後に、変数に対してのみ有効です。ただし、列挙型は変数というよりもデータ型のように考える必要があります。

2
Boris Strandjev