是否可以从资源常量声明一个String以用于switch case?

时间:2016-07-23 13:15:56

标签: java android string constants

我有这段代码,旨在将字符串从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;
    }

}

2 个答案:

答案 0 :(得分:2)

无法解决“需要常量表达式”编译错误。 Java语言规范要求交换表达式是编译时常量表达式

我的建议是构建一个HashMap。使用资源常量值作为键,将得分/位置用作值。

以下是JLS关于这个问题的说法:

JLS §14.11

  

每个案例标签都有一个case常量,它是常量表达式或enum常量的名称。

JLS §15.28

  

常量表达式是表示基本类型的值的表达式或不突然完成的String的表达式,仅使用以下内容组成:

     
      
  • 原始类型的文字和String类型的文字。
  •   
  • 添加剂运算符+-
  •   
  • 引用常量变量的简单名称。
  •   
  • 引用常量变量的<TypeName> . <Identifier>形式的合格名称。
  •   
  • ....
  •   

JLS §14.12.4

  

常量变量是基本类型的final变量或类型String,用常量表达式初始化。

为什么?

  1. 基本类型的switch语句的实现使用代码中需要文字常量的JVM指令。

  2. 在String和enum情况下,使用编译器/运行时系统基于案例构建的代码/数据结构来执行切换。如果情况不是常量,那么编译器就无法构造它们。

  3. 如果开关常量的值不是常数,则编译器无法对明确的赋值和可达性进行适当的分析。

  4. 前两个可以被视为“公正”的实施细节。最后一点更为基础。放宽规则会破坏语言。

答案 1 :(得分:-2)

一切皆有可能

 switch(text) {
    case getString(R.string.three):
        return 0;
    case "four":
        return 1;
    case "five":
        return 2;
    default:
        return 0;
}
相关问题