2012-04-30 21 views
8

में enum मानों के स्ट्रिंग प्रस्तुतियों का उपयोग करना स्विच केस में स्ट्रिंग के रूप में enum मानों का उपयोग करना क्यों संभव नहीं है? (या क्या यह :)स्विच-केस

String argument; 
switch (argument) { 
    case MyEnum.VALUE1.toString(): // Isn't this equal to "VALUE1" ? 
    // something  
break; 
    case MyEnum.VALUE2.toString(): 
    // something else 
break; 

उत्तर

22

आप केवल स्ट्रिंग्स का उपयोग कर सकते हैं जो संकलन समय पर ज्ञात हैं। संकलक उस अभिव्यक्ति का परिणाम निर्धारित नहीं कर सकता है।

शायद आप,

String argument = ... 
switch(MyEnum.valueOf(argument)) { 
    case VALUE1: 

    case VALUE2: 
+0

महत्वपूर्ण बात यह है कि 'VALUE1' स्थिर है। आपके पास अपना 'myValueOf() 'हो सकता है और यह अभी भी काम करेगा। –

+0

अरे, 'valueOf()' किसी मामले में नहीं है। मैं पिछली टिप्पणी को हटा रहा हूं, इसे देख नहीं सकता। एक बार फिर धन्यवाद। – Bloke

+3

valueOf() के साथ सावधान रहें जो तर्क नहीं है अगर एनपीई और IllegalArgumentException फेंक दें। इन अपवादों को संभालने से बचने के लिए ब्लोक का कोड समझ में आता है (लेकिन दुख की बात नहीं है)। – Nereis

5

मामले MyEnum.VALUE1.toString साथ कुछ गड़बड़ है(): // नहीं इस बराबर करने के लिए "VALUE1" है?

नहीं है, जरूरी नहीं कि: आप toString()

public enum MyType { 
VALUE1 { 
    public String toString() { 
     return "this is my value one"; 
    } 
}, 

VALUE2 { 
    public String toString() { 
     return "this is my value two"; 
    } 
} 

का अपना स्वयं का कार्यान्वयन} आप कंपनी छोड़ने के बाद

इसके अलावा, कोई है जो अपने कोड को बनाए रखने है इस कार्यान्वयन जोड़ सकते हैं प्रदान करने के लिए स्वतंत्र हैं । यही कारण है कि आपको स्ट्रिंग मानों पर भरोसा नहीं करना चाहिए, और इसके बजाय enum एस के बजाय संख्यात्मक मानों का उपयोग करने के लिए चिपकना चाहिए (जैसा कि स्थिरांक MyEnum.VALUE1, MyEnum.VALUE2 आदि द्वारा दर्शाया गया है)।

+0

"आपके enums के सांख्यिक मूल्य"? क्या आपका मतलब है कि आपके enums के निरंतर नाम गणना? – assylias

+0

@assylias बेशक, मैं निश्चित रूप से निरंतर नामों का उपयोग करना चाहता हूं, इन नामों के अनुरूप पूर्णांक अक्षर नहीं! धन्यवाद, मैंने इस महत्वपूर्ण बिंदु को दर्शाने के लिए उत्तर संपादित किया। – dasblinkenlight

+0

ओह, ठीक है। यह एक अच्छा स्पष्टीकरण है, धन्यवाद। – Bloke

1

पीटर Lawrey की टिप्पणी करने के लिए जोड़ने के लिए कोशिश कर सकते हैं पिछले साल से this पोस्ट पर एक नज़र जो पहले और JDK7 के बाद जावा में स्ट्रिंग पर स्विचिंग की चर्चा की है।

+0

यह भी नहीं पता था कि जेडीके 7 से पहले यह संभव नहीं था। धन्यवाद, वहां एक टिप्पणी में इसके बारे में एक महान लिंक मिला: [लिंक] (http://www.xefer.com/2006/12/switchonstring) - क्या स्ट्रिंग इनपुट को संसाधित करने का सबसे अच्छा तरीका है? – Bloke

+1

खैर, एक शुद्धवादी कह सकता है कि आपको ओओपी भाषा में स्विच/केस स्टेटमेंट का उपयोग नहीं करना चाहिए; इसके बजाए, आपको इस तरह से निपटने के लिए एक बहुलक रणनीति के साथ जाना चाहिए।आईएमओ, यदि यह स्पष्ट, संक्षिप्त, रखरखाव योग्य और कुशल है, तो कई स्थितियों में एक मामला/स्विच सबसे अच्छा समाधान है। – Sanjeev

-1

EDIT: जावा प्रश्न के सी # उत्तर के लिए क्षमा। मुझे नहीं पता कि वहां क्या गलत हुआ।

यह स्ट्रिंग मानों (enums के स्ट्रिंग मान सहित) का उपयोग करने के लिए संभव है। हालांकि, आप केवल संकलन-समय स्थिरांक का उपयोग कर सकते हैं। आप एक विधि, ToString() पर कॉल कर रहे हैं, जिसे रनटाइम पर मूल्यांकन करने की आवश्यकता है।

सी # 6 के रूप में, तो आप इस निरंतर विकल्प का उपयोग कर सकते हैं: case nameof(SomeEnum.SomeValue):

Nameof() बस एक स्ट्रिंग दी चर, प्रकार, या सदस्य की (अयोग्य) नाम से मेल करने के लिए, संकलन समय पर मूल्यांकन किया जाता है । इसका मूल्य SomeEnum.ToString() से मेल खाता है।