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


106

मैंने इस प्रश्न के समान एसओ के रूप में विभिन्न प्रश्नोत्तरों को देखा है लेकिन समाधान नहीं मिला है।

मेरे पास एक एनम है जो एक टीवी गाइड को देखने के विभिन्न तरीकों का प्रतिनिधित्व करती है ...

NDroid Applicationवर्ग में

static enum guideView {
    GUIDE_VIEW_SEVEN_DAY,
    GUIDE_VIEW_NOW_SHOWING,
    GUIDE_VIEW_ALL_TIMESLOTS
}

... जब उपयोगकर्ता दृश्य बदलता है तो एक घटना हैंडलर int0-2 से प्राप्त होता है और मैं ऐसा कुछ करना चाहता हूं ...

एक Android Activity onClick(DialogInterface dialog, int which)ईवेंट हैंडलर में

// 'which' is an int from 0-2
switch (which) {
    case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY:
    ...
    break;
}

मैं C # एनम और सेलेक्ट / केस स्टेटमेंट का उपयोग कर रहा हूं, जो उपरोक्त जैसा कुछ करने की अनुमति देगा और मुझे पता है कि जावा अलग तरह से काम करता है, लेकिन मैं सिर्फ यह समझ नहीं सकता कि मुझे क्या करने की आवश्यकता है।

क्या मुझे ifबयानों का सहारा लेना पड़ेगा ? केवल 3 विकल्प होने की संभावना है इसलिए मैं इसे कर सकता था लेकिन मुझे आश्चर्य था कि यह जावा में स्विच-केस के साथ कैसे किया जा सकता है।

संपादित करें क्षमा करें, मैंने इस मुद्दे पर पूरी तरह से विस्तार नहीं किया क्योंकि मैं इसे एक सामान्य जावा समस्या के रूप में देख रहा था। मैंने सवाल को थोड़ा और समझाने के लिए जोड़ा है।

एंड्रॉइड विशिष्ट कुछ भी नहीं है यही कारण है कि मैंने इसे एंड्रॉइड के रूप में टैग नहीं किया है, लेकिन एनम को Applicationवर्ग और कोड में परिभाषित किया गया है जहां मैं स्विच नहीं करता हूं Activity। Enum स्थिर है क्योंकि मुझे इसे कई गतिविधियों से एक्सेस करने की आवश्यकता है।


1
case GUIDE_VIEW_SEVEN_DAYउचित आयात के बाद ही होना चाहिए ; आपको किस तरह की समस्या हो रही है?
डेव न्यूटन

क्या आप अपने ईवेंट हैंडलर को एक एनम प्राप्त नहीं कर सकते? इसके अलावा, शायद यह मदद करेगा: stackoverflow.com/questions/5292790/…
ब्रायन रोच

@Dave: ओह, क्षमा करें, मैंने यह दिखाने के लिए कोड को सही किया है कि यह कैसा है। एक्लिप्स मुझे एक टाइप मिसमैच त्रुटि दे रहा है जिसमें कहा गया है कि यह गाइड व्यू से इंट में परिवर्तित नहीं हो सकता है।
स्क्वॉन्क

@ ब्रायन: यह एक एंड्रॉइड ऐप है और ईवेंट हैंडलर ( OnClickListener ) उस DialogInterfaceइंटरफेस द्वारा परिभाषित किया गया है जिसे मुझे लागू करना है।
स्क्वॉन्क

@MisterSquonk ओह, मुझे याद है कि आप इसे एक इंट - सॉरी से प्राप्त कर रहे थे, ओफिडियन का जवाब देखें, हालांकि मैं एनम में कार्यक्षमता डालूंगा।
डेव न्यूटन

जवाबों:


162

आप जिस भाग को याद कर रहे हैं वह पूर्णांक से टाइप-सुरक्षित एनम में परिवर्तित हो रहा है। जावा स्वचालित रूप से नहीं करेगा। इस बारे में आप कुछ तरीके बता सकते हैं:

  1. टाइप-सेफ एनम के बजाय स्टैटिक फाइनल इन्ट्स की एक सूची का उपयोग करें और आपके द्वारा प्राप्त इंट वैल्यू पर स्विच करें (यह पूर्व-जावा दृष्टिकोण है)
  2. या तो एक निर्दिष्ट आईडी मान पर स्विच करें (जैसा कि हेनरीविले द्वारा वर्णित है ) या एनम मूल्यों के क्रमिक मूल्य; अर्थातguideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
  3. इंटम मूल्य द्वारा दर्शाए गए एनम मूल्य को निर्धारित करें और फिर एनम मूल्य पर स्विच करें।

    enum GuideView {
        SEVEN_DAY,
        NOW_SHOWING,
        ALL_TIMESLOTS
    }
    
    // Working on the assumption that your int value is 
    // the ordinal value of the items in your enum
    public void onClick(DialogInterface dialog, int which) {
        // do your own bounds checking
        GuideView whichView = GuideView.values()[which];
        switch (whichView) {
            case SEVEN_DAY:
                ...
                break;
            case NOW_SHOWING:
                ...
                break;
        }
    }

    आपको एक कस्टम valueOfकार्यान्वयन लिखने के लिए यह अधिक सहायक / कम त्रुटि वाला हो सकता है जो उचित एनुम मान को हल करने के तर्क के रूप में आपके पूर्णांक मानों को लेता है और आपको अपनी सीमा जाँच को केंद्रीकृत करने देता है।


बहुत धन्यवाद। मुझे अपने कोड में काम करने में थोड़ा समय लगा, लेकिन अब आपके द्वारा पोस्ट किए गए उदाहरण कोड के साथ अच्छी तरह से काम कर रहा है। 6 साल C # के साथ और 1 साल जावा के साथ - अक्सर ऐसा नहीं होता है कि मुझे कुछ ऐसा करना पड़े जो मुझे चौंका दे। इतनी सारी समानताएँ लेकिन सामयिक एक ऐसा जो इतना अलग है। मैं इसे जल्दी में नहीं भूलूंगा। :-)
स्क्वॉन्क

2
आपको केस स्टेटमेंट में अयोग्य एनुम नामों की आवश्यकता है, इसलिए case GuideView.SEVEN_DAY:एक संकलन त्रुटि देता है, यह होना चाहिए case SEVEN_DAY:
११:

यह शानदार भाई है !!
नव

42

अगर whichViewगाइडवुम एनम का एक उद्देश्य है, निम्नलिखित अच्छी तरह से काम करता है। कृपया ध्यान दें कि इसके बाद स्थिरांक के लिए कोई योग्यता नहीं है case

switch (whichView) {
    case SEVEN_DAY:
        ...
        break;
    case NOW_SHOWING:
        ...
        break;
}

4
यह संभव ही कैसे है?!
जेसन चेरगुई

12

एनम को केस लेबल के भीतर योग्य नहीं होना चाहिए जैसे कि आपके पास क्या है NDroid.guideView.GUIDE_VIEW_SEVEN_DAY, इसके बजाय आपको योग्यता और उपयोग को हटा देना चाहिएGUIDE_VIEW_SEVEN_DAY


इसे पसंद करता है। सरल!
लेजी निंजा

5

मुझे जावा एनम के कुछ उपयोग पसंद हैं:

  1. .name () आपको स्ट्रिंग में एनम नाम लाने की अनुमति देता है।
  2. .ordinal () आपको पूर्णांक मान प्राप्त करने की अनुमति देता है, 0-आधारित।
  3. आप प्रत्येक एनम के साथ अन्य मान पैरामीटर संलग्न कर सकते हैं।
  4. और, ज़ाहिर है, सक्षम स्विच।

मान मापदंडों के साथ एनम:

    enum StateEnum {
        UNDEFINED_POLL  ( 1 * 1000L,       4 * 1000L),
        SUPPORT_POLL    ( 1 * 1000L,       5 * 1000L),
        FAST_POLL       ( 2 * 1000L,  4 * 60 * 1000L),
        NO_POLL         ( 1 * 1000L,       6 * 1000L); 
        ...
    }

स्विच उदाहरण:

private void queuePoll(StateEnum se) {
    // debug print se.name() if needed
    switch (se) {
        case UNDEFINED_POLL:
            ...
            break;
        case SUPPORT_POLL:
            ...
            break;

3

यह उस तरीके से काम करना चाहिए जिसका आप वर्णन करते हैं। आप क्या त्रुटि प्राप्त कर रहे हैं? यदि आप अपने कोड को पेस्टबिन कर सकते हैं जो मदद करेगा।

http://download.oracle.com/javase/tutorial/java/javaOO/enum.html

संपादित करें: क्या आप सुनिश्चित हैं कि आप एक स्थिर एनम को परिभाषित करना चाहते हैं? यह मेरे लिए सही नहीं लगता है। एक एनुम किसी भी अन्य वस्तु की तरह है। यदि आपका कोड संकलित करता है और चलाता है लेकिन गलत परिणाम देता है, तो शायद यही कारण है।


"नेस्टेड एनम प्रकार स्पष्ट रूप से स्थिर होते हैं। यह स्पष्ट रूप से एक नेस्टेड एनुम को स्थिर होने की घोषणा करने की अनुमति है।" - जेएलएस .98.9
trashgod

@trashgod, वास्तव में- लेकिन मैं हमेशा भ्रम से बचने के लिए निहित घोषणा का उपयोग करूंगा क्योंकि यह वास्तव में अधिक स्पष्ट IMO है। एक वैश्विक स्टैटिक एनम (जो मैं यह मानता हूं) ज्यादातर मामलों में गलत है।
सिस्टमपैराक्स

2
enumerations accessing is very simple in switch case

private TYPE currentView;

//declaration of enum 
public enum TYPE {
        FIRST, SECOND, THIRD
    };

//handling in switch case
switch (getCurrentView())
        {
        case FIRST:
            break;
        case SECOND:
            break;
        case THIRD:
            break;
        }

//getter and setter of the enum
public void setCurrentView(TYPE currentView) {
        this.currentView = currentView;
    }

    public TYPE getCurrentView() {
        return currentView;
    }

//usage of setting the enum 
setCurrentView(TYPE.FIRST);

avoid the accessing of TYPE.FIRST.ordinal() it is not recommended always

यह तभी काम करता है जब आपको अपना डेटा बाहरी रूप से नहीं मिल रहा हो। चूंकि ओपी ने कहा था कि जो मूल्य 1, 2, 3 लौटाता है, न कि आपकी विधि एक उलट स्विच केस के बिना काम नहीं करेगी, जो कि 1, 2, 3 लेता है और वह सूचीबद्ध किए गए स्विच मामले में जाने से पहले एक TYPE लौटाता है ..
WORMSS

2

लघु साहचर्य समारोह उदाहरण:

public String getIcon(TipoNotificacao tipo)
{
    switch (tipo){
        case Comentou : return "fa fa-comments";
        case ConviteEnviou : return "icon-envelope";
        case ConviteAceitou : return "fa fa-bolt";
        default: return "";
    }
}

जैसा @ दनुष्का ने कहा, "स्विच" के अंदर क्वालीफायर को छोड़ना ही महत्वपूर्ण है।


1

मैं इसे पसंद कर रहा हूं

public enum State
{
    // Retrieving, // the MediaRetriever is retrieving music //
    Stopped, // media player is stopped and not prepared to play
    Preparing, // media player is preparing...
    Playing, // playback active (media player ready!). (but the media player
                // may actually be
                // paused in this state if we don't have audio focus. But we
                // stay in this state
                // so that we know we have to resume playback once we get
                // focus back)
    Paused; // playback paused (media player ready!)

    //public final static State[] vals = State.values();//copy the values(), calling values() clones the array

};

public State getState()
{
        return mState;   
}

और स्विच स्टेटमेंट में उपयोग करें

switch (mService.getState())
{
case Stopped:
case Paused:

    playPause.setBackgroundResource(R.drawable.selplay);
    break;

case Preparing:
case Playing:

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