2010-04-18 10 views
37

क्यों निम्नलिखित कोड, संकलित करने के लिए असफल करतामुझे एनम निरंतर संदर्भ क्यों मिलता है किसी केस लेबल में योग्य नहीं किया जा सकता है?

case ENUM1: doSomeStuff(); 

कार्यों के लिए मामले बयान बदलते समय?

public enum EnumType 
{ 
    ENUM1, ENUM2, ENUM3; 

    void doSomeStuff() 
    { 
     switch(this) 
     { 
     case EnumType.ENUM1: doSomeStuff(); 
     } 
    } 
} 
+4

होगा "जावा खामियां है और वास्तव में इसे समझने की कोशिश नहीं करते "एक उचित उत्तर हो? मेरा मतलब है, यहां जवाब महान और विस्तृत हैं, लेकिन इस मामले में मुझे लगता है कि वे वास्तव में कोई फर्क नहीं पड़ता। +1 प्रश्न, -1 जावा ... –

+1

@ColinD आपके मामले में [सही स्पष्टीकरण] (http://stackoverflow.com/a/2664040/506879) है। Enums पर (इस कामकाजी नमूने के साथ) पर इस क्वालीफायर मुद्दे के समाधान के बारे में विस्तार से देखने के लिए, कृपया [यह पोस्ट] देखें (http://www.davestone.net/blog/post/The-enum-constant-reference-cannot -be-योग्य-in-a-case-label.aspx) – rekaszeru

उत्तर

33

यह विभिन्न enum प्रकारों के खिलाफ तुलना करने की क्षमता से बचने के लिए है। एक प्रकार, यानी switch कथन में enum मान का प्रकार प्रतिबंधित करना समझ में आता है।

अद्यतन: यह वास्तव में बाइनरी संगतता रखने के लिए है। यहाँ एक के बारे में आधे रास्ते chapter 13.4.9 JLS की से अदालत में तलब है:

स्थिरांक को इनलाइन करने की आवश्यकता होती है के लिए

एक कारण यह है कि switch बयान प्रत्येक case पर स्थिरांक की आवश्यकता है, और कोई दो तरह के निरंतर मूल्यों एक ही हो सकता है। कंपाइलर संकलन समय पर switch कथन में डुप्लिकेट स्थिर मानों के लिए जांच करता है; class फ़ाइल प्रारूप केस मानों का प्रतीकात्मक लिंक नहीं करता है।

दूसरे शब्दों में, EnumType.ENUM1 में वर्ग पहचानकर्ता की वजह से, यह एक compiletime निरंतर अभिव्यक्ति के रूप में, जबकि यह switch बयान के लिए आवश्यक है नहीं दर्शाया जा सकता।

+2

हम्म ... मैं 100% आश्वस्त नहीं हूं। 'अन्यEnumType.ENUM1' (ग्रहण) कंपाइलर को' टाइप मिस्चैच देता है: 'EnumType से EnumType' में कनवर्ट नहीं किया जा सकता है, जबकि 'EnumType.ENUM1'' देता है 'योग्य केस लेबल EnumType.ENUM1 को अयोग्य एनम निरंतर ENUM1 के साथ प्रतिस्थापित किया जाना चाहिए '। तो मेरे लिए ऐसा लगता है कि प्रकार क्वालीफायर को प्रतिबंधित करने का प्रकार मिस्चैच का पता लगाने से संबंधित नहीं है। –

+1

मुझे यह पसंद है! अच्छा लगता है। – maleki

+2

यह उत्तर पर्याप्त रूप से इसकी व्याख्या नहीं करता है। इस बारे में कुछ स्पष्टीकरण होना चाहिए कि इसे कैसे लिखा जाना चाहिए। – Lisa

20

चूंकि आप EnumType के किसी ऑब्जेक्ट पर स्विच कर रहे हैं और इसके लिए केवल संभावित मान एनम स्थिरांक हैं, स्विच के भीतर फिर से उन स्थिरांक को अर्हता प्राप्त करने की आवश्यकता नहीं है। आखिरकार, case OtherEnumType.ENUM1: में वैसे भी अवैध होना अवैध होगा।

+0

मुझे लगता है कि यह सही मामला हो सकता है। "Case enumType.enum" के बजाय "केस enum:" का उपयोग कर अन्य एनीम टाइप से एनम का उपयोग करने का प्रयास करने से आप जो वर्णन करते हैं उसके करीब एक त्रुटि देता है। – maleki

26

यह वास्तव में आपके सवाल का जवाब नहीं है, लेकिन यदि आप कोड enum मूल्य के आधार पर है, तो आप भी अपने enum में एक सार विधि है कि हर मूल्य के लिए अतिभारित हो जाता है बना सकते हैं:

public enum EnumType { 
    ENUM1 { 
     @Override 
     public void doSomeStuff() { 
      // do something 
     } 
    }, 
    ENUM2 { 
     @Override 
     public void doSomeStuff() { 
      // do something else 
     } 
    }; 

    public abstract void doSomeStuff(); 
} 
+0

बेस्ट उत्तर +1। यह मान नए मान जोड़ते समय बेहतर सुरक्षा प्रदान करता है, क्योंकि आप केस स्टेटमेंट को खोने की तुलना में विधि कार्यान्वयन को जोड़ना नहीं भूल सकते हैं। – whiskeysierra

+0

संकेत: यदि आप एक सार्थक डिफ़ॉल्ट कार्यान्वयन प्रदान कर सकते हैं तो SomomeStuff सार बनाने की कोई ज़रूरत नहीं है। – whiskeysierra

+1

यदि आपके पास सार्थक डिफ़ॉल्ट मामला है, तो उसे अपने स्विच में डिफ़ॉल्ट केस के रूप में रखें। –

संबंधित मुद्दे

 संबंधित मुद्दे