2012-03-27 17 views
18
public interface Proposal { 
    public static final enum STATUS { 
     NEW , 
     START , 
     CONTINUE , 
     SENTTOCLIENT 
    }; 
} 

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

+0

「最終的ではない」列挙型が何らかの形でサブクラス化できると思いますか? –

+0

私は列挙型がサブクラス化できないことを知っていませんでしたが、Javaはインターフェイスの定数から最終的なものを書くことができますが、enumの前ではありません。 –

+0

class/interface(そして、原則として列挙型)の定義とmember * field *の定義(これは通常は定数がインターフェイスにある)との間で、 'final'がどのように使用されるかには大きな違いがあります。 1つはサブクラス性に影響し、もう1つは変更可能性に影響します。 –

答えて

21

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

さらに、インスタンスが独自のクラス本体を持たない列挙型は、暗黙的には最終的にJLS section 8.9である。

25

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

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

+0

完全に紛らわしい答えです。 java.lang.Enumクラスのソースを見ると、最終クラスではなく抽象クラスであることがわかります。 –

+2

それにもかかわらず、 'enum'型はサブクラス化できません。 –

+5

@EugeneKuleshov: 'Enum'クラスは、それを拡張できる必要があるため抽象クラスです。しかし、それを拡張する実際の 'enum'は、' final'クラスとしてコンパイラによって定義されます。 http://mindprod.com/jgloss/enum.html#UNDERTHEHOOD1 – StriplingWarrior

6

2つのこと:

  1. 列挙型は、列挙型は、クラスのメンバーである場合、それは暗黙的に静的
2

で宣言するにはポイントjava.lang.Enum

  • の最終サブクラスではありません最終列挙型。クラスのfinalとは、継承できないことを意味します。ただし、列挙型はデフォルトで継承することはできません(つまり、最終的です)。

    最終的なものは、変数に対してのみ有効です。しかし、列挙型は変数よりもデータ型に似ていると考えるべきです。

  • 関連する問題