2013-05-08 38 views
6

से निरंतर अभिव्यक्ति क्या एक enum को निरंतर अभिव्यक्ति में परिवर्तित करने का कोई तरीका है? मैं अपने स्विच ऑपरेटर एक enum के मूल्यों के बीच चयन करना चाहते हैं, लेकिन मैं एक संकलन त्रुटि "मामले भाव स्थिर भाव होना चाहिए" मिल गया, तो मैं एक चर में यह घोषित करने की कोशिश:एनम

final int REG = MyEnum.REG.getIndex().intValue(); 

switch (service.getIndex()) { 

case REG: 

लेकिन मैं अभी भी एक ही त्रुटि प्राप्त करें। ओरेकल के दस्तावेज़ के अनुसार http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28

एक संकलन समय निरंतर अभिव्यक्ति है एक अभिव्यक्ति है कि अचानक पूरा नहीं है और है केवल का उपयोग कर बना निम्नलिखित आदिम प्रकार या एक स्ट्रिंग के एक मूल्य दर्शाने:

Literals • आदिम प्रकार और प्रकार के शाब्दिक प्रकार स्ट्रिंग

तो यह काम नहीं कर रहा है क्योंकि मैं एक शाब्दिक उपयोग नहीं कर रहा हूं। मुझे लगता है कि मुझे इसे घोषित करना होगा:

final int REG = 8; 

लेकिन यह enum को जोड़ने के लिए बेहतर होगा। ऐसा करने का कोई रास्ता नहीं है?

संपादित

बाहर कर देता है मैं किसी भी अंतिम चर का उपयोग करने की जरूरत नहीं। यह उतना आसान है जितना:

switch (service) { 

case REG: 

यह तब तक नहीं हुआ जब तक मैंने एंड्रिया की टिप्पणी नहीं देखी। आपके उत्तरों के लिए धन्यवाद।

+1

मुझे लगता है कि 'service.getIndex()' 'रिटर्न पूर्णांक ', है ना? क्या आप इसे संशोधित कर सकते हैं ताकि यह आपके enum को वापस कर सके? –

+1

जावा 1.6 तक आप 'स्विच-केस' में 'स्ट्रिंग' का उपयोग नहीं कर सकते हैं, लेकिन आप इसे जावा 7 में उपयोग कर सकते हैं। FYI – Joshi

उत्तर

6

यदि संभव हो, तो अपने getIndex() विधि को संशोधित करें ताकि यह पूर्णांक की बजाय enum लौटा सके।

public enum Index { 
    ONE, 
    TWO, 
    THREE 
} 

आप एक enum तत्व करने के लिए अपने सूचकांक मैप कर सकते हैं

Index.values()[index] 
का उपयोग करके:

निम्नलिखित enum को देखते हुए: यदि यह संभव नहीं है, तो आप नक्शा एक enum तत्व को सूचकांक करने की जरूरत है

अपने विधि Integer getIndex() देखते हुए, आप तो

switch(Index.values()[getIndex()]) 
    case ONE : ... 
     break; 

    case TWO : ... 
     break; 

    case THREE : ... 
     break; 
} 
की तरह कुछ कर सकते हैं

ध्यान दें कि यह ArrayIndexOutOfBoundsException फेंक सकता है यदि आप enum तत्वों की संख्या से बड़ा है जो enum के भीतर एक अनुक्रमणिका तक पहुंचने का प्रयास करते हैं (उदा। उपरोक्त नमूने में, यदि getIndex() एक मान देता है> 2)।


मैं valueOf(int index), डिफ़ॉल्ट valueOf(String s) के लिए इसी तरह की तरह एक enum विधि में अभिव्यक्ति Index.values()[getIndex()] संपुटित होगा। इसके बाद आप वहां वैध सरणी इंडेक्स की जांच भी कर सकते हैं (और उदाहरण के लिए यदि इंडेक्स रेंज से बाहर है तो उदाहरण के लिए एक विशेष एनम वैल्यू लौटाएं)।इसी तरह, आप फिर भी असतत मूल्यों जो विशेष अर्थ है परिवर्तित कर सकते हैं:

public enum Index { 
    ZERO, 
    ONE, 
    TWO, 
    THREE, 
    REG, 
    INVALID; 


    public static Index valueOf(int index) { 

     if (index == 8) { 
      return REG; 
     } 

     if (index >= values().length) { 
      return INVALID; 
     } 

     return values()[index]; 
    } 
} 

यह केवल एक उदाहरण है - किसी भी मामले में, यह आम तौर पर मान आप अपने getIndex() विधि से प्राप्त की सीमा पर निर्भर करता है, और कैसे आप चाहते हैं उन्हें enum तत्वों के लिए मानचित्र बनाने के लिए।

फिर आप यह

switch(Index.valueOf(service.getIndex())) { 
    case ZERO : ... break; 
    ... 
    case REG : ... break; 
    ... 
} 

देखें तरह कुछ अतिरिक्त जानकारी (विशेष रूप से संकेत है कि values() एक महंगी आपरेशन है, क्योंकि यह सरणी की एक प्रति हर बार वापस जाने के लिए इसकी आवश्यकता के लिए उपयोग कर सकते हैं भी Cast Int to enum in Java कहा जाता है)।

+0

यह मेरे लिए काम करता है! आपका बहुत बहुत धन्यवाद! – Mauker

2

आप enum constacts करने के लिए सौंपा विशिष्ट अंक मूल्यों चाहते हैं इस

enum MyReg { 
    REG(8), OTHER(13); 

    public final int value; 
    MyReg(int value) { 
     this.value=value; 
    } 
} 

तरह जाना फिर आप इस तरह उपयोग:

class Test { 
    public static void main(String[] args) { 
     MyReg reg = MyReg.REG; 
     switch (reg) { 
     case OTHER: 
      System.out.println(reg.value); 
      break; 
     case REG: 
      System.out.println(reg.value); 
      break; 
     } 
    } 
}