2012-05-11 20 views
7
enum Color {RED, GREEN, BLUE}; 
class SwitchEnum 
{ 
    public static void main(String[] args) 
    { 
    Color c = Color.GREEN; 
    switch(c) 
    { 
     case RED: 
     System.out.println("red"); 
     break; 
     case GREEN: 
     System.out.println("green"); 
     break; 
     case BLUE: 
     System.out.println("blue"); 
     break; 
    } 
    } 
} 

उपरोक्त कोड ठीक से संकलित करता है और अपेक्षित आउटपुट देता है।स्विच केस में एनम रेफरेंसिंग

मेरा सवाल यह है कि जब रंग संदर्भ 'सी' बनाते हैं तो हमें इसे enum (यानी Color.GREEN) के नाम से संदर्भित करने की आवश्यकता होती है, लेकिन मामले में ब्लॉक केवल enum value पर्याप्त है। यह

case Color.RED: 

आदि ???

उत्तर

5

नहीं, यह नहीं होना चाहिए। जावा कंपाइलर यह जानकर काफी समझदार है कि आप Color पर स्विच कर रहे हैं और इसलिए भाषा इस शॉर्टकट के लिए अनुमति देती है (और पॉल नोट्स के रूप में, इसकी आवश्यकता होती है)। वास्तव में, एक स्विच स्टेटमेंट का पूरा संकलन संकलक पर निर्भर करता है कि आप क्या स्विच कर रहे हैं, क्योंकि यह आपके द्वारा निर्दिष्ट enum मान के सूचकांक के आधार पर स्विच को एक जंप टेबल में अनुवाद करता है। केवल हाल ही में आप String जैसी गैर-संख्यात्मक चीजों पर स्विच करने में सक्षम हैं।

भाषा कल्पना की प्रासंगिकता का JLS Chapter 14.11 में है:

... 
SwitchLabel: 
    case ConstantExpression : 
    case EnumConstantName : 
    default : 

EnumConstantName: 
    Identifier 

तुम क्यों भाषा जिस तरह से यह था डिजाइन किया गया था बारे में विस्तृत जानकारी के लिए देख रहे हैं, कि करने के लिए होने वाला है मुश्किल उद्देश्य से जवाब दें। भाषा डिजाइन को बढ़ाया गया है, और आपको यह मानना ​​होगा कि एनम समर्थन को जोड़ने से पहले असाइनमेंट सिंटैक्स साल और साल लिखा गया था।

+1

+1 वास्तव में आपके पास * शॉर्टकट का उपयोग करने के लिए * है। उदाहरण के लिए [यह दिलचस्प पोस्ट] देखें (http://stackoverflow.com/q/8481635/697449)। –

+0

@ पॉल: एक एनम स्विच केस लेबल ** ** एक enum स्थिरांक का _unqualified_ नाम होना चाहिए। thnx ... मिल गया ... – WickeD

2

यह एक भाषा सम्मेलन है। कई अलग-अलग भाषाओं में enums हैं, और आप सब ऐसा नहीं करते हैं। जावा के मामले में, आप नेमस्पेस के कारण Color.RED या जो कुछ भी कर सकते हैं। ऐसा करके, आप एक ही चर नामों के साथ कई enums हो सकता है, और वे संघर्ष नहीं करते हैं।

कारण यह है कि स्विच बयान Color.RED करने के लिए आप की आवश्यकता नहीं है (और आप बस लाल राज्य के लिए अनुमति देता है) स्विच बयान को पता है कि यह है कि यह के प्रकार के रंग एक enum है, और उस नाम स्थान में दिखता है।

1

लाइन

Color c = Color.GREEN; 

Color. आवश्यक है क्योंकि जावा कम्पाइलर घोषणा (Color c) से सौंपा अभिव्यक्ति (Color.GREEN) के प्रकार का अनुमान लगा नहीं है।

ArrayList<String> x = new ArrayList<String>(); 

और नहीं बस

ArrayList<String> x = new ArrayList(); 

(यह वास्तव में आंशिक रूप से जावा 7 में तय हो गई है, लेकिन यह एक और कहानी है।) switch(...) बयान में के प्रकार: उसी कारण से, आप लिखने के लिए है case को switch के प्रकार से अनुमानित किया गया है।

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