2013-06-27 19 views
8

私は前に、または、このように列挙型定数を宣言せずに変数を宣言する場合:enum型で他の変数やメソッドの宣言よりも前にenum定数を宣言する必要があるのはなぜですか?

enum MyEnum 
{ 
    int i = 90; 
} 

それは、次のコンパイルエラーが表示されます。

MyEnum.java:3: <identifier> expected 
{ 
^ 
MyEnum.java:4: ',', '}', or ';' expected 
     int i = 90; 
     ^
MyEnum.java:4: '}' expected 
     int i = 90; 
      ^
MyEnum.java:5: class, interface, or enum expected 
} 
^ 
4 errors 

しかし、私はiを宣言する前に列挙型定数を宣言した場合、それは罰金コンパイルします。
さえ、次のコードは罰金コンパイルします:Javaの列挙がこのように設計されたのはなぜ

enum MyEnum 
{ 
    ;//put a semicolon 
    int i = 90; 
} 

+0

まず最初に、 'enum'はゼロ以上の要素の*列挙*になるように設計されています。このデザインは完全に有効です。 –

+0

少なくとも1つの列挙定数を持つことが必須であるためです。これが構文がJava言語仕様で定義されている方法です。なぜなら。 – EJP

+0

@EJPしかし、後のケースでは、私は定数を宣言していませんが、変数を宣言する前にセミコロンを追加するだけです。 'Enum'は少なくとも一つのenum定数を持つべきであるという命令に反していませんか? –

答えて

10

;は、列挙識別子リストの最後を示します。どうやら空の列挙リストを持つことはできますが、その列挙リストを持つ必要があります。

Java Language Specification8.9.1参照:列挙の

+4

特に: 'EnumBodyDeclarations: ; ClassBodyDeclarationsopt' – assylias

+0

クイックレスポンスのためのThnxとJLSへの関連リンク。うん、私はそのリンクを通過した。しかし、私はjavaのenumsのようなdesginの制約の理由を得ることができませんでした。最終的には、Javaが列挙型を設計する方法に過ぎないと仮定しなければなりません。他には次のような理由はありません。enumはロード、初期化、またはその他の点でJVMによって処理される方法です。 –

2

2つの必須の部分を列挙を含むことができる列挙型の

8.9.1列挙定数
体定数である:

  1. 列挙型識別子。
  2. enum body。

あなたが最初列挙体列挙型識別子リストを宣言しなければなりません。 ここでは、最初の部分が必須であるため、;が最初の部分を示しています。それを無視すると、コンパイルエラーが発生します。 ;を追加すると、の両方の条件を満たすようにがコンパイルされます。

関連する問題