Можно ли использовать целочисленные ресурсы Android в операторах switch?

#java #android #eclipse

#java #Android #eclipse

Вопрос:

У меня есть «numeric.xml «файл в каталоге «values» моего проекта, который содержит большинство целочисленных констант проекта. Я хотел бы использовать некоторые из этих констант в операторе switch, но Eclipse / Java это не нравится, потому что он не учитывает «resources.getInteger(R.integer.ИМЯ_ЦЕЛОГО числа)» должно быть константой. Есть ли какой-нибудь способ заставить компилятор и / или Eclipse увидеть, что это константа, или мне просто нужно работать с цепочками if / else?

Редактировать: я попытался выполнить «final int INTEGER_NAME = resources.getInteger(R.целое число.ИМЯ_ЦЕЛОГО числа)» и использование ИМЯ_ЦЕЛОГО числа в операторе case, но это тоже не сработало.

Комментарии:

1. я попробовал это, и это сработало Resources r = getResources(); int i = r.getInteger(R.integer.lol); switch (i) { case 1: Log.d("lol", "hehehe0"); break; default: break; }

2. @subspider — OP спрашивает об использовании resut of r.getInteger(...) в качестве значения case , а не в качестве switch параметра.

Ответ №1:

Технически ваши целочисленные значения ресурсов не являются константами. Как компилятор должен знать значение для каждого случая? Всегда есть возможность извлечения разных значений для разных конфигураций. (У вас могла бы, например, быть values-land папка ресурсов с разными значениями для ландшафта.) Или вы могли бы просто изменить значения в файле xml.

Если они действительно являются константами, определите их в коде. Единственная другая альтернатива, которую я вижу, — это создать таблицу отправки выполняемых (или вызываемых) объектов, по одному для каждой ветви коммутатора, и получить соответствующий на основе значения, извлеченного из ресурсов.

Комментарии:

1. Тед, спасибо за этот ответ. Надеюсь, вы не возражаете, если я задам вам вопрос новичка в Java. Существует ли чистый способ определения констант в Java таким образом, чтобы они определялись в одном месте, но могли быть видны нескольким несвязанным классам?

2. @Jim Clay да, вы размещаете класс, который расширяется из приложения, и объявляете переменную как статическую, надеюсь, это помогло, но если она постоянная, лучше использовать xml resorces, просто если это сложный тип, я бы использовал static

3. @Jim — Я часто использую интерфейсы для этого. Вы можете определить интерфейс как просто набор значений полей. Согласно спецификации языка, они неявно являются окончательными и статичными.

4. @Ted Hopp Я бы рекомендовал не использовать интерфейс для констант, вместо этого используйте класс Constants и, возможно, статический импорт

5. @dave.c — Что мне нравится в использовании интерфейсов, так это то, что я могу просто объявить класс для реализации интерфейса, и тогда все имена констант будут частью пространства имен класса. Не могли бы вы пояснить, почему интерфейс не является хорошей идеей?

Ответ №2:

Ну, resources.getInteger(R.integer.INTEGER_NAME) это не более константа, чем resources.getString(R.string.STRING_NAME) : это поиск, поэтому вы на самом деле не сможете использовать их в операторе case. Вам придется смириться с цепочкой if / else.

Ответ №3:

я попробовал это, и это сработало

 Resources r = getResources(); 
int i = r.getInteger(R.integer.lol); 
switch (i) { 
    case 1: 
        Log.d("lol", "hehehe0"); 
        break; 
    default: 
        break; 
}
  

Комментарии:

1. Да, я мог видеть, что это работает, но это не совсем то, чего я хочу. Я хочу заменить «case 1» на «case r.getInteger …».

2. OP спрашивает об использовании resut of r.getInteger(...) в качестве case значения, а не в качестве switch параметра.

3. @Jim Clay могу я узнать, почему вы хотите это сделать или в каком контексте?

4. У меня есть функция, которая принимает некоторые входные параметры, которые говорят ей оставить определенные логические значения в покое, установить для них значение true или false. В программе на C / C я бы обработал что-то подобное с помощью перечисления и переключателя. Очевидно, что только с тремя возможностями цепочка if / else не имеет большого значения, но мне было любопытно посмотреть, есть ли решение.