2012-02-14 5 views
17

के अंदर मैं एक enum के अंदर एक निजी स्थिर अंतिम चर बनाने की कोशिश कर रहा हूँ, लेकिन मैं एक संकलन त्रुटि प्राप्त करते रहना। क्या कोई जानता है कि इसे कैसे ठीक करें?निजी स्थिर अंतिम चर एक 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

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

* संपादित करें *

बंद आधार पर अपने मूल प्रश्न में किए गए संपादनों, मैं देख रहा हूँ तुम क्या करने कोशिश कर रहे हैं। एनम परिभाषा में घोषित आपके enum शाब्दिक घोषणाओं में स्थिरांक का उपयोग करना संभव नहीं है। ऐसा इसलिए है क्योंकि शाब्दिक घोषणाएं enum में पहला तत्व होना चाहिए। यह जावा भाषा विशिष्टता द्वारा अनिवार्य है। हालांकि दो त्वरित चीजें:

  1. आप private static final Strings का उपयोग कर रहे हैं। यह आपको देता है, इसके बजाय स्ट्रिंग अक्षर का उपयोग करने पर बिल्कुल कोई लाभ नहीं, जो समस्या का समाधान करेगा।
  2. यदि आप पुन: प्रयोज्य स्थिरांक (public static final Strings) घोषित करना चाहते हैं तो आपको en12 के के बाहर करना होगा।

वैकल्पिक रूप से आप अपने Enums एक वर्ग है जो आप के लिए 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

टॉम - "अपने क्षेत्र को अपने तरीकों के बारे में बताएं" से आपका क्या मतलब है? – 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