जावा: उपवर्ग के तहत एनम के साथ स्विच स्टेटमेंट का उपयोग करना


265

पहले मैं बताता हूं कि मैं सी # में एनमों से अधिक परिचित हूं और ऐसा लगता है जैसे जावा में एनम काफी गड़बड़ है।

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

मुझे प्राप्त होने वाली त्रुटि है:

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

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

//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;
            }
        }
    }
}

Darrengorman टिप्पणी की, जावा Enumहैं बेहद आसान है एक बार आप उनमें से लटका मिलता है - सब एक मेस में नहीं। वे अन्य प्लेटफॉर्मों पर देखे गए सरल एन्यूम्स (केवल एक लेबल पूर्णांक मान) की तुलना में बहुत अधिक लचीले और व्यावहारिक हैं। ओरेकल ट्यूटोरियल देखें । अनुकूलित Set/ Mapकार्यान्वयन की खोज करें: EnumSetऔर EnumMap
बेसिल बोर्के

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

IntelliJ 2018.2 में एक कक्षा को फिर से शुरू करने (आगे बढ़ने) के दौरान मेरे साथ हुआ
डैनियल एल्डर

जवाबों:


570

इसे इसमें बदलें:

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

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


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

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

11
@milkplusvellocet, मुझे पता है कि यह पोस्ट पहले से पुरानी है, लेकिन मैं उत्सुक हूं कि जावा स्विच स्टेटमेंट में योग्य केस लेबल की अनुमति क्यों नहीं देता ?
jzarsuelo

3
@ cRane01 यकीन के लिए नहीं पता है, लेकिन यह एक क्लीनर वाक्यविन्यास के लिए बनाता है। प्रत्येक मामले पर प्रकार निर्दिष्ट करना पूरी तरह से बेमानी होगा
darrengorman

3
@HelloGoodbye नहीं। स्विच स्टेटमेंट का वैरिएबल केस स्टेटमेंट के प्रकार को परिभाषित करता है, इसलिए यह केवल एक एनुम हो सकता है।
स्प्रिंटर

33

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

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

14
अयोग्य क्यों होना चाहिए ?
थोरबजोरन रावन एंडरसन

11
यदि आप योग्यता प्राप्त कर सकते हैं, तो आप कुछ और का उपयोग कर सकते हैं, MyEnumजिससे कोई मतलब नहीं होगा।
क्रु

1
@Kru, लेकिन मैं गैर-एनुम-टाइप किए गए मामले के अभिव्यक्तियों के लिए कुछ व्याकरणिक रूप से उपयोग कर सकता हूं । उदाहरण के लिएstatic final int MY_CONST = 7; …; switch(intVariable) {case MY_CONST: …;} बजाय case 7। तो एनम के लिए यह प्रतिबंध कोई मतलब नहीं है (मैं न केवल प्राथमिक शाब्दिक उपयोग कर सकता हूं, बल्कि पूर्णांक switchअभिव्यक्ति के लिए मैन्युअल रूप से परिभाषित स्थिरांक भी उपयोग कर सकता हूं, लेकिन मैं मैन्युअल रूप से परिभाषित स्थिरांक का उपयोग नहीं कर सकता, लेकिन केवल एनम के लिए प्राथमिक नाम)।
साशा

4

यह करना चाहिए:

//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;
            }
        }
    }
}

आपने दिन बचा लिया!
सोहम मेहता


2

इस तरह मैं इसका उपयोग कर रहा हूं। और यह काल्पनिक रूप से काम कर रहा है -

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;
        }
    }
}

0

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

public void someMethod() {

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

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

स्विच स्टेटमेंट में आपको केवल स्थिर नाम का उपयोग करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.