2012-04-15 14 views
157

के तहत enum के साथ स्विच स्टेटमेंट का उपयोग करके सबसे पहले मैं यह कहूंगा कि मैं सी # में enums से अधिक परिचित हूं और ऐसा लगता है कि जावा में enums एक काफी गड़बड़ है।जावा: सबक्लास

जैसा कि आप देख सकते हैं, मैं अपने अगले उदाहरण में एक स्विच स्टेटमेंट @ एनम्स का उपयोग करने की कोशिश कर रहा हूं लेकिन मुझे हमेशा कोई त्रुटि नहीं मिलती है कि मैं क्या कर रहा हूं।

त्रुटि मैं प्राप्त है:

योग्य मामला लेबल SomeClass.AnotherClass.MyEnum.VALUE_A अयोग्य enum निरंतर के साथ प्रतिस्थापित किया जाना चाहिए VALUE_A

बात मैं काफी त्रुटि को समझें लेकिन मैं है enum केवल VALUE_A नहीं लिख सकता क्योंकि enum किसी अन्य उप-वर्ग में स्थित है। क्या इस समस्या को हल करने का कोई तरीका है? और यह जावा में क्यों हो रहा है?

//Main Class 
public class SomeClass { 

    //Sub-Class 
    public static class AnotherClass { 
     public enum MyEnum { 
      VALUE_A, VALUE_B 
     }  
     public MyEnum myEnum; 
    } 

    public void someMethod() { 
     MyEnum enumExample //... 

     switch (enumExample) { 
      case AnotherClass.MyEnum.VALUE_A: { <-- error on this line 
       //.. 
       break; 
      } 
     } 
    } 
} 
+0

दिखाया darrengorman टिप्पणी की, जावा [ 'Enum'] (http://docs.oracle.com/javase/8/ के रूप में डॉक्स/एपीआई/जावा/लैंग/एनयूएम.html) * बेहद आसान हैं जब आप उन्हें लटका लेंगे - बिल्कुल गड़बड़ नहीं। वे अन्य प्लेटफार्मों पर देखे गए सरल enums (केवल एक लेबल वाले पूर्णांक मान) से अधिक लचीला और व्यावहारिक हैं। [ओरेकल ट्यूटोरियल] देखें (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)। अनुकूलित 'सेट' /' मानचित्र 'कार्यान्वयन की खोज करें: ['EnumSet'] (http://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html) और [' EnumMap'] (http://docs.oracle.com/javase/8/docs/api/java/util/EnumMap.html)। –

+0

जब आप केस स्टेटमेंट अर्हता प्राप्त करने का प्रयास करते हैं; एक तरह से, आप यह कहने की कोशिश कर रहे हैं कि मैं एक ही स्विच स्टेटमेंट के भीतर विभिन्न प्रकार के enums (केवल एक ही enum प्रकार नहीं) मिश्रण कर सकते हैं। जावा ने इस दृष्टिकोण के साथ इसे रोक दिया है जैसा कि यहां चर्चा की गई है http://www.digizol.com/2010/10/enum-case-label-switch-java-qualified.html – lkamal

उत्तर

362

इस के बदले यह:

switch (enumExample) { 
    case VALUE_A: { 
     //.. 
     break; 
    } 
} 

सुराग गलती से हुआ है। आपको enum प्रकार के साथ case लेबल योग्यता प्राप्त करने की आवश्यकता नहीं है, केवल इसकी कीमत।

+13

ठीक है, मैं बहुत बेवकूफ महसूस करता हूं :-( आप पूरी तरह से सही हैं, मुझे विश्वास था कि मैंने इस सटीक रेखा की कोशिश की और इसके साथ एक त्रुटि मिली, इसलिए मैं केस योग्यता प्राप्त करने के लिए चले गए, लेकिन आपका सुझाव काम करता है। – Popokoko

+4

जिस तरह से मुझे लगता है कि आप ' आप पाएंगे कि जावा में enums अविश्वसनीय रूप से उपयोगी हैं जब आप उन्हें और अधिक उपयोग करना शुरू कर देते हैं, तो मैं नहीं कहूंगा कि वे एक गड़बड़ हैं :) – darrengorman

+0

मुझे विश्वास है कि मैं आपको निकट भविष्य में सही लगेगा :) वैसे भी, यह है निश्चित रूप से आपके जैसे लोगों के लिए धन्यवाद के आसपास सबसे अच्छा प्रोग्रामिंग मंच। – Popokoko

21

जावा स्वचालित रूप से case में तत्वों के प्रकार infers, तो लेबल अयोग्य होना चाहिए।

int i; 
switch(i) { 
    case 5: // <- integer is expected 
} 
MyEnum e; 
switch (e) { 
    case VALUE_A: // <- an element of the enumeration is expected 
} 
+8

क्यों _must_ यह अयोग्य हो गया है? –

+8

यदि आप अर्हता प्राप्त कर सकते हैं, तो आप 'MyEnum 'से कुछ और उपयोग कर सकते हैं जो समझ में नहीं आता है। – Kru

+0

@Kru, लेकिन मैं ** व्याकरणिक रूप से कुछ का उपयोग कर सकता हूं-अन्यथा गैर-एनम-टाइप किए गए केस एक्सप्रेशन के लिए। जैसे'स्थिर अंतिम int MY_CONST = 7; ...; स्विच (intVariable) {केस MY_CONST: ...;} '' केस 7' के बजाय। इसलिए enums के लिए यह प्रतिबंध ** नहीं ** समझता है (मैं केवल प्राथमिक अक्षर का उपयोग नहीं कर सकता, बल्कि पूर्णांक 'स्विच' अभिव्यक्ति के लिए मैन्युअल रूप से परिभाषित स्थिरांक भी उपयोग कर सकता हूं, लेकिन मैं मैन्युअल रूप से परिभाषित स्थिरांक का उपयोग नहीं कर सकता, लेकिन केवल प्राथमिक नाम enums)। – Sasha

0

लिखें someMethod() इस तरह से:

public void someMethod() { 

    SomeClass.AnotherClass.MyEnum enumExample = SomeClass.AnotherClass.MyEnum.VALUE_A; 

    switch (enumExample) { 
    case VALUE_A: 
     break; 
    } 

} 

स्विच बयान में आप निरंतर नाम ही उपयोग करना चाहिए।

2

इस करना चाहिए:

//Main Class 
public class SomeClass { 

    //Sub-Class 
    public static class AnotherClass { 
     public enum MyEnum { 
      VALUE_A, VALUE_B 
     }  
     public MyEnum myEnum; 
    } 

    public void someMethod() { 
     AnotherClass.MyEnum enumExample = AnotherClass.MyEnum.VALUE_A; //... 

     switch (enumExample) { 
      case VALUE_A: { //<-- error on this line 
      //.. 
      break; 
      } 
     } 
    } 
} 
0

यह वह जगह है मैं इसे कैसे उपयोग कर रहा हूँ। और यह असामान्य रूप काम कर रहा है -

public enum Button { 
     REPORT_ISSUES(0), 
     CANCEL_ORDER(1), 
     RETURN_ORDER(2); 

     private int value; 

     Button(int value) { 
      this.value = value; 
     } 

     public int getValue() { 
      return value; 
     } 
    } 

और switch-case के रूप में नीचे

@Override 
public void onClick(MyOrderDetailDelgate.Button button, int position) { 
    switch (button) { 
     case REPORT_ISSUES: { 
      break; 
     } 
     case CANCEL_ORDER: { 
      break; 
     } 
     case RETURN_ORDER: { 
      break; 
     } 
    } 
} 
संबंधित मुद्दे