Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 430
Squonk Avatar asked Nov 13 '11 01:11

Squonk


People also ask

Can we use enum in switch-case in Java?

We can use also use Enum keyword with Switch statement. We can use Enum in Switch case statement in Java like int primitive.

Can we use switch with enum?

You definitely can switch on enums.

Can enum be checked in switch-case statement?

Can enum be checked in a switch-case statement? Yes. Enum can be checked. As an integer value is used in enum.

Can enum throw exception?

You can throw unchecked exceptions from an enum constructor.


2 Answers

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.

like image 76
Ophidian Avatar answered Sep 29 '22 16:09

Ophidian


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; } 
like image 34
Dhanushka Avatar answered Sep 29 '22 15:09

Dhanushka