Я просмотрел различные вопросы и ответы на SO, похожие на этот вопрос, но не нашел решения.
У меня есть перечисление, которое представляет различные способы просмотра телегида ...
В Application
классе NDroid
static enum guideView {
GUIDE_VIEW_SEVEN_DAY,
GUIDE_VIEW_NOW_SHOWING,
GUIDE_VIEW_ALL_TIMESLOTS
}
... когда пользователь меняет представление, обработчик событий получает сообщение int
от 0 до 2, и я хотел бы сделать что-то вроде этого ...
В Activity
onClick(DialogInterface dialog, int which)
обработчике событий Android
// '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.
ИЗМЕНИТЬ Извините, я не полностью раскрыл проблему, так как рассматривал ее как общую проблему Java. Я добавил к вопросу, чтобы немного пояснить.
Нет ничего специфичного для Android, поэтому я не пометил его как Android, но перечисление определено в Application
классе, а код, в котором я не хочу переключаться, находится в файле Activity
. Перечисление статично, так как мне нужно получить к нему доступ из нескольких Activity.
источник
case GUIDE_VIEW_SEVEN_DAY
после надлежащего импорта; Какие у вас проблемы?OnClickListener
) определяетсяDialogInterface
интерфейсом, который я должен реализовать.Ответы:
Часть, которую вам не хватает, - это преобразование целого числа в типобезопасное перечисление. Java не сделает этого автоматически. Есть несколько способов сделать это:
guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
Определите значение перечисления, представленное значением int, а затем включите значение перечисления.
Вы можете найти более полезным / менее подверженным ошибкам написать собственную
valueOf
реализацию, которая принимает ваши целочисленные значения в качестве аргумента для разрешения соответствующего значения перечисления и позволяет централизовать проверку границ.источник
case GuideView.SEVEN_DAY:
выдает ошибку компиляции, она должна бытьcase SEVEN_DAY:
.Если
whichView
это объект GuideView Enum, следующее работает хорошо. Обратите внимание, что для константы после нет квалификатораcase
.источник
Перечисления не должны быть квалифицированы внутри метки case, как у вас
NDroid.guideView.GUIDE_VIEW_SEVEN_DAY
, вместо этого вам следует удалить квалификацию и использоватьGUIDE_VIEW_SEVEN_DAY
источник
Мне нравится несколько вариантов использования Java enum:
перечисление со значениями параметров:
пример переключателя:
источник
Это должно работать так, как вы описываете. Какую ошибку вы получаете? Если бы вы могли вставить свой код, это помогло бы.
http://download.oracle.com/javase/tutorial/java/javaOO/enum.html
EDIT: вы уверены, что хотите определить статическое перечисление? Мне это не кажется правильным. Перечисление очень похоже на любой другой объект. Если ваш код компилируется и запускается, но дает неверные результаты, вероятно, причина в этом.
источник
источник
Краткий пример ассоциативной функции:
Как сказал @Dhanushka, опустить квалификатор внутри "switch" - это ключ.
источник
Я делаю это как
И использовать в заявлении Switch
источник