列挙

2011-01-24 12 views
5

のメンバーフィールドの順序のJavaの列挙型のための重要な宣言の順序は、私がなぜこのギブは(コンパイル時)とはどういう意味なぜエラー列挙

public enum ErrorCodes { 
    public int id; 
    Undefined; 
} 

が、この1つは罰金です:

public enum ErrorCodes { 
    Undefined; 
    public int id; 

}. 

答えて

5

これはenumの構文です。しかし、これは異なる注文を可能にする可能性がありますが、フィールドに型を置いてenum値にするのを忘れるなど、間違いが起きている可能性があります。

編集:私は、フィールド、メソッド、初期化子、およびコンストラクタはどのような順序でも構いません。間違いを減らすためには、この制限が有効であると私は信じています。たとえフィールド/コンストラクタ/メソッドがどのような順序であっても、その順序で読みやすくするために非常に一般的です。

+2

+1 - 注文が縛られていない場合、列挙型は読みにくく、構文解析が難しくなり、構文エラーメッセージが分かりにくくなります。 –

6

これは非常に満足のいく回答ではありませんが、Javaでenumがどのように定義されているかだけです。 「Java言語仕様」のセクション8.9 Enumsを参照してください。

1

Java Enumは特別な種類のクラスです。そのシンプルで、ほとんど有用な形態には、カスタムフィールドが含まれていません:

public enum ErrorCodes { 
    Undefined, Defined, Foo, Bar 
} 

コンパイラの魔法は、およそ次のようなクラスを作成します。

public class ErrorCodes { 
    public final static ErrorCodes Undefined = new ErrorCodes(); 
    public final static ErrorCodes Defined = new ErrorCodes(); 
    public final static ErrorCodes Foo = new ErrorCodes(); 
    public final static ErrorCodes Bar = new ErrorCodes(); 
} 

このコンパイラの魔法は、右列挙ヘッダの後にフィールド定義を期待しています。

Sunは非常に親切で、eunumメンバーの定義に従うフィールドを追加できます。 public enum ErrorCodes { 未定義、定義済み、Foo、Bar; プライベートString myField; }

の列挙型フィールドの後に、カスタムコードを常に定義する必要があるのは、です。

+0

それは "コンパイラの魔法"ではありません...それは一般的なまたは庭の "構文"です。 –