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" является ключом.