Java с использованием перечисления с оператором switch

Я посмотрел на различные Q & As on SO, похожие на этот вопрос, но не нашел решения.

У меня есть перечисление, представляющее различные способы просмотра телегида...

В классе NDroid Application

static enum guideView {
    GUIDE_VIEW_SEVEN_DAY,
    GUIDE_VIEW_NOW_SHOWING,
    GUIDE_VIEW_ALL_TIMESLOTS
}

... когда пользователь меняет представление, обработчик события получает int от 0-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;
}

Я привык к перечислениям С# и операторам select/case, которые позволили бы что-то вроде выше, и я знаю, что Java делает вещи по-другому, но я просто не могу понять, что мне нужно делать.

Придется ли мне прибегать к утверждениям if? Вероятно, будет только 3 варианта, поэтому я мог бы это сделать, но я подумал, как это можно сделать с помощью коммутатора в Java.

EDIT Извините, я не полностью раскрыл эту проблему, поскольку рассматривал ее как общую проблему с Java. Я добавил к вопросу, чтобы объяснить немного дальше.

Нет ничего особенного в Android, поэтому я не отмечал его как Android, но перечисление было определено в классе Application, а код, в котором я отключен, находится в Activity. Перечисление является статическим, поскольку мне нужно получить к нему доступ из нескольких действий.

Ответ 1

Часть, которую вам не хватает, - это преобразование из целого в безопасное имя. Java не будет делать это автоматически. Есть несколько способов, которыми вы можете это сделать:

  • Используйте список статических окончательных целых чисел, а не перечислимое типа, и включите полученное значение int (это подход до Java 5)
  • Включить либо указанное значение id (как описанное heneryville), либо порядковое значение значений перечисления; т.е. guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
  • Определите значение перечисления, представленное значением int, а затем включите значение перечисления.

    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, которая принимает ваши целые значения в качестве аргумента для разрешения соответствующего значения перечисления и позволяет централизовать проверку границ.

Ответ 2

Если whichView является объектом EnView GuideView, то работает хорошо. Обратите внимание, что после case нет определителя для константы.

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

Ответ 3

Перечисления не должны быть указаны на ярлыке case, как у вас есть NDroid.guideView.GUIDE_VIEW_SEVEN_DAY, вместо этого вы должны удалить квалификацию и использовать GUIDE_VIEW_SEVEN_DAY

Ответ 4

Это должно работать так, как вы описываете. Какую ошибку вы получаете? Если бы вы могли использовать свой код, который бы помог.

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

EDIT: Вы уверены, что хотите определить статическое перечисление? Это звучит неправильно для меня. Перечисление очень похоже на любой другой объект. Если ваш код компилируется и запускается, но дает неверные результаты, это, вероятно, будет причиной.

Ответ 5

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

Ответ 6

Я делаю это как

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

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

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

case Preparing:
case Playing:

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

Ответ 7

Пример короткой ассоциативной функции:

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

Как @Dhanushka сказал, опустить квалификатор внутри "switch" является ключом.