2012-02-14 10 views
17

enum内にプライベートstatic final変数を作成しようとしていますが、コンパイルエラーが発生しています。誰もがこれを修正する方法を知っていますか?enum内のプライベートstatic final変数

Multiple markers at this line

  • Syntax error, insert "Identifier" to complete EnumConstantHeaderName
  • Syntax error, insert "}" to complete EnumBody
class Foo { 
    ... 

    public enum MyEnum { 
    private static final String MY_STRING = "a string I use in a constructor"; 
    private static final String MY_OTHER_STRING = "a string I use in another constructor";  

    MyEnumType(1, MY_STRING), 
    MyEnumType2(2, MY_STRING), 
    MyEnumType3(3, MY_OTHER_STRING); 

    MyEnum(int num, String str) { 
     ... 
    } 
    } 
... 
} 

答えて

20

enum定数は、列挙の最初の要素である必要があります。コンパイルコードのバージョン:

class Foo { 

    public enum MyEnum { 
     MyEnumType, MyEnumType2; 

     public String bar() { 
      return MY_STRING; 
     } 

     public String bar2() { 
      return MY_STRING + "2"; 
     } 

     private static final String MY_STRING = "a string I reuse in the enum"; 
    } 
} 

* EDIT *

あなたの元の質問に行われたオフに基づいて編集、私はあなたがやろうとしているものを参照してください。 enum定義自体で宣言されたenumリテラル宣言に定数を使用することはできません。これは、リテラル宣言が列挙の最初の要素でなければならないからです。これはJava言語仕様で規定されています。 2つの簡単な事柄:

  1. private static final Stringsを使用しています。これにより、 文字列リテラルの代わりに、 を使用すると、問題を解決することはできません。
  2. 再利用可能な定数(public static final Strings)を宣言する場合は、の外にの列挙型を指定する必要があります。

は、別の方法としては、あなたのためprivate static final Stringさんを定義するクラスのネストした要素として、あなたの列挙型を宣言することができます。

いくつかの擬似コード:

public class Foo { 
    public static enum MyEnum { 
     MyEnumType(0, MY_STRING), MyEnumType2(1, "Hello"); 

     private int ordinal; 
     private String value; 

     MyEnum(int ordinal, String value) { 
      this.ordinal = ordinal; 
      this.value = value; 
     } 

     public int getOrdinal() { 
      return ordinal; 
     } 

     public String getValue() { 
      return value; 
     } 

     public void setOrdinal(int ordinal) { 
      this.ordinal = ordinal; 
     } 

     public void setValue(String value) { 
      this.value = value; 
     } 
    } 

    private static final String MY_STRING = "a string I reuse in the enum"; 
} 
+0

条約には、あなたの方法についてのフィールドを入れることが記載されています。 –

+1

私は実際にコンストラクタで文字列を使用しています。 – will

+0

Tom - 「あなたの方法についてのフィールドを入れてください」とはどういう意味ですか? – will

6

インタフェースを使用することができます。

class Foo { 
    ... 

    private interface MyEnumConstants { 
    static final String MY_STRING = "a string I use in a constructor"; 
    static final String MY_OTHER_STRING = "a string I use in another constructor";  
    } 

    public enum MyEnum implements MyEnumConstants { 
    MyEnumType(1, MY_STRING), 
    MyEnumType2(2, MY_STRING), 
    MyEnumType3(3, MY_OTHER_STRING); 

    MyEnum(int num, String str) { 
     ... 
    } 
    } 
... 
} 
+1

別のクラスに両方を含める必要がない場合は、enum内にインターフェイスをネストすることができます。 – MithrilTuxedo

19

ことが可能です、あなただけの直接変数を参照する必要があります。

class Foo { 
    ... 

    public enum MyEnum { 

    MyEnumType(1, MyEnum.MY_STRING), 
    MyEnumType2(2, MyEnum.MY_STRING), 
    MyEnumType3(3, MyEnum.MY_OTHER_STRING); 

    MyEnum(int num, String str) { 
     ... 
    } 

    private static final String MY_STRING = "a string I use in a constructor"; 
    private static final String MY_OTHER_STRING = "a string I use in another constructor"; 
    } 
... 
} 
+0

恐ろしい! – TWiStErRob

+1

私はこれで不正な前方参照を取得していますが、代わりにコンパイル済みのパターンを渡しています。列挙型の中にネストされたインタフェースがトリックを行いました。 – MithrilTuxedo

+0

(奇妙なことに)コンパイルしたようですが、実行時に 'java.lang.NoClassDefFoundError:クラスを初期化できませんでした' – qwertzguy

関連する問題