ChatGPT解决这个技术问题 Extra ChatGPT

Java using enum with switch statement

I've looked at various Q&As on SO similar to this question but haven't found a solution.

What I have is an enum which represents different ways to view a TV Guide...

In the NDroid Application class

static enum guideView {
    GUIDE_VIEW_SEVEN_DAY,
    GUIDE_VIEW_NOW_SHOWING,
    GUIDE_VIEW_ALL_TIMESLOTS
}

...when the user changes the view an event handler receives an int from 0-2 and I'd like to do something like this...

In an Android Activity onClick(DialogInterface dialog, int which) event handler

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

I'm used to C# enums and select/case statements which would allow something like the above and I know Java does things differently but I just can't make sense of what I need to do.

Am I going to have to resort to if statements? There will likely only ever be 3 choices so I could do it but I wondered how it could be done with switch-case in Java.

EDIT Sorry I didn't completely expand on the issue as I was looking at it as being a generic Java issue. I've added to the question to explain a bit further.

There isn't anything that's Android specific which is why I didn't tag it as Android but the enum is defined in the Application class and the code where I wan't the switch is in an Activity. The enum is static as I need to access it from multiple Activities.

Should just be case GUIDE_VIEW_SEVEN_DAY after proper imports; what problem(s) are you having?
Can't you just make your event handler receive an enum? Aside from that, perhaps this will help: stackoverflow.com/questions/5292790/…
@Dave: Ooops sorry, I've corrected the code to show how it is. Eclipse is giving me a Type Mismatch error saying it can't convert from guideView to int.
@Brian: This is an Android app and the event handler (OnClickListener ) is defined by the DialogInterface interface that I have to implement.
@MisterSquonk Oh, I missed you were getting it from an int--sorry, see Ophidian's answer, although I'd put the functionality in the enum.

C
Community

The part you're missing is converting from the integer to the type-safe enum. Java will not do it automatically. There's a couple of ways you can go about this:

Use a list of static final ints rather than a type-safe enum and switch on the int value you receive (this is the pre-Java 5 approach) Switch on either a specified id value (as described by heneryville) or the ordinal value of the enum values; i.e. guideView.GUIDE_VIEW_SEVEN_DAY.ordinal() Determine the enum value represented by the int value and then switch on the enum value. 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; } } You may find it more helpful / less error prone to write a custom valueOf implementation that takes your integer values as an argument to resolve the appropriate enum value and lets you centralize your bounds checking.


Many thanks. It took me a while to work it into my code but it's working nicely now with the example code you posted. 6 years with C# and 1 year with Java - it's not often I come across something that stumps me. So many similarities but the occasional one like this which is so very different. I won't forget this one in a hurry. :-)
You need the unqualified enum names in the case statement, so case GuideView.SEVEN_DAY: gives a compilation error, it should be case SEVEN_DAY:.
D
Dhanushka

If whichView is an object of the GuideView Enum, following works well. Please note that there is no qualifier for the constant after case.

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

P
Piyush Mattoo

The enums should not be qualified within the case label like what you have NDroid.guideView.GUIDE_VIEW_SEVEN_DAY, instead you should remove the qualification and use GUIDE_VIEW_SEVEN_DAY


d
david m lee

I like a few usages of Java enum:

.name() allows you to fetch the enum name in String. .ordinal() allow you to get the integer value, 0-based. You can attach other value parameters with each enum. and, of course, switch enabled.

enum with value parameters:

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

switch example:

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

C
Carl Manaster

This should work in the way that you describe. What error are you getting? If you could pastebin your code that would help.

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

EDIT: Are you sure you want to define a static enum? That doesn't sound right to me. An enum is much like any other object. If your code compiles and runs but gives incorrect results, this would probably be why.


"Nested enum types are implicitly static. It is permissable to explicitly declare a nested enum type to be static."—JLS §8.9.
@trashgod, indeed- but I would always use the implicit declaration to avoid confusion as that's actually more obvious IMO. A global static enum (which is what I assume this is) is probably wrong in most cases.
A
Auston

Short associative function example:

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

Like @Dhanushka said, omit the qualifier inside "switch" is the key.


J
Jaya
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

That only works if you are not getting your data externally. Since OP said which returns value 1, 2, 3 not a TYPE your method would not work without a reversed switch case that takes 1, 2, 3 and returns a TYPE before going into the switch case he listed..
Z
Zar E Ahmer

I am doing it like

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

And use in Switch Statement

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

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

case Preparing:
case Playing:

    playPause.setBackgroundResource(R.drawable.selpause);
    break;    
}