我有这段代码,旨在将字符串从Spinner项转换为整数,以便在应用程序的另一部分中使用。当我在switch case中有常量字符串时,这很有效,但后来我想将这些硬编码字符串移动到Strings.xml资源中以将它们与逻辑分开。这是我遇到麻烦的地方,因为Java希望字符串保持不变。
我试图让琴弦最终,但它没有任何区别。所以我的问题是,它是否可以以某种方式使资源中的字符串保持不变,以使它们可以在下面的代码片段中的开关案例中使用?
public int getPositionFromText(String text) {
// The string representations of the different score methods.
String[] scoreOptions = getResources().getStringArray(R.array.scoreOptions);
final String three = scoreOptions[0];
final String four = scoreOptions[1];
final String five = scoreOptions[2];
switch(text) {
case three:
return 0;
case four:
return 1;
case five:
return 2;
default:
return 0;
}
}
答案 0 :(得分:2)
无法解决“需要常量表达式”编译错误。 Java语言规范要求交换表达式是编译时常量表达式。
我的建议是构建一个HashMap
。使用资源常量值作为键,将得分/位置用作值。
以下是JLS关于这个问题的说法:
每个案例标签都有一个
case
常量,它是常量表达式或enum
常量的名称。
常量表达式是表示基本类型的值的表达式或不突然完成的
String
的表达式,仅使用以下内容组成:
- 原始类型的文字和
String
类型的文字。- 添加剂运算符
+
和-
。- 引用常量变量的简单名称。
- 引用常量变量的
<TypeName> . <Identifier>
形式的合格名称。- ....
常量变量是基本类型的
final
变量或类型String
,用常量表达式初始化。
为什么?
基本类型的switch语句的实现使用代码中需要文字常量的JVM指令。
在String和enum情况下,使用编译器/运行时系统基于案例构建的代码/数据结构来执行切换。如果情况不是常量,那么编译器就无法构造它们。
如果开关常量的值不是常数,则编译器无法对明确的赋值和可达性进行适当的分析。
前两个可以被视为“公正”的实施细节。最后一点更为基础。放宽规则会破坏语言。
答案 1 :(得分:-2)
一切皆有可能
switch(text) {
case getString(R.string.three):
return 0;
case "four":
return 1;
case "five":
return 2;
default:
return 0;
}