Java с использованием enum с оператором switch - PullRequest
101 голосов
/ 13 ноября 2011

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

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

В NDroid Application class

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

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

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

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

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

Ответы [ 8 ]

152 голосов
/ 13 ноября 2011

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

  1. Используйте список статических конечных целых чисел, а не типобезопасное перечисление и включите полученное значение int (это пре-Java 5подход)
  2. Включите либо указанное значение идентификатора (как , описанное heneryville ), либо порядковое значение значений перечисления;т.е. guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
  3. Определите значение перечисления, представленное значением 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, которая принимает целочисленные значения в качестве аргумента для разрешения соответствующего значения перечисления и позволяет централизовать проверку границ.

39 голосов
/ 19 февраля 2013

Если whichView является объектом Enum GuideView, хорошо работает следующее.Пожалуйста, обратите внимание, что после case.

switch (whichView) {
    case SEVEN_DAY:
        ...
        break;
    case NOW_SHOWING:
        ...
        break;
}
не существует квалификатора для константы.
12 голосов
/ 13 ноября 2011

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

5 голосов
/ 19 января 2018

Мне нравится несколько случаев использования перечисления Java:

  1. .name () позволяет вам получить имя перечисления в String.
  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 голосов
/ 13 ноября 2011

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

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

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

2 голосов
/ 01 августа 2017

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

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

2 голосов
/ 26 апреля 2013
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 голос
/ 22 мая 2015

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

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 Statement

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

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

case Preparing:
case Playing:

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