2012-02-14 43 views
17

我想創建一個枚舉中的私有靜態最終變量,但我不斷收到編譯錯誤。有誰知道如何解決這一問題?enum中的私有靜態最終變量

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

枚舉常數需要爲在枚舉的第一要素。你的代碼的版本,編譯:

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"; 
    } 
} 

*編輯*

到你原來的問題作出

基於關閉的編輯,我看到你正在嘗試做的。不可以在枚舉定義本身中聲明的枚舉文字聲明中使用常量。這是因爲字面聲明必須是枚舉中的第一個元素。這是由Java語言規範強制的。兩件很快的事情:

  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

公約說,把你的領域關於你的方法。 – 2012-02-14 01:21:24

+1

我實際上是在構造函數中使用字符串。 – will 2012-02-14 01:51:03

+0

湯姆 - 你說「把你的領域放在你的方法上」是什麼意思? – will 2012-02-14 01:51:29

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

如果你不想在另一個類中包含這兩個接口,你可以在這個枚舉中嵌套這個接口。 – MithrilTuxedo 2016-08-17 19:57:58

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 2016-07-18 23:15:09

+1

我收到了一個非法的前向引用,但我傳遞了編譯模式。儘管嵌套在枚舉中的接口做到了這一點。 – MithrilTuxedo 2016-08-17 19:57:05

+0

似乎編譯(奇怪),但然後在運行時我得到'java.lang.NoClassDefFoundError:無法初始化類' – qwertzguy 2016-08-25 20:45:12