Java using enum with switch statement

JavaEnumsSwitch Statement

Java Problem Overview


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.

Java Solutions


Solution 1 - Java

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:

  1. 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)

  2. 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()

  3. 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.

Solution 2 - Java

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

Solution 3 - Java

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

Solution 4 - Java

I like a few usages of Java enum:

  1. .name() allows you to fetch the enum name in String.
  2. .ordinal() allow you to get the integer value, 0-based.
  3. You can attach other value parameters with each enum.
  4. 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;

Solution 5 - Java

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.

Solution 6 - Java

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.

Solution 7 - Java

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

Solution 8 - Java

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSquonkView Question on Stackoverflow
Solution 1 - JavaOphidianView Answer on Stackoverflow
Solution 2 - JavaDhanushkaView Answer on Stackoverflow
Solution 3 - JavaPiyush MattooView Answer on Stackoverflow
Solution 4 - Javadavid m leeView Answer on Stackoverflow
Solution 5 - JavaSystemParadoxView Answer on Stackoverflow
Solution 6 - JavaAustonView Answer on Stackoverflow
Solution 7 - JavaJayaView Answer on Stackoverflow
Solution 8 - JavaZar E AhmerView Answer on Stackoverflow