【问题标题】:Is it possible to declare a String from a resource constant for use in a switch case?是否可以从资源常量声明一个字符串以在 switch 案例中使用?
【发布时间】:2016-07-23 13:15:55
【问题描述】:

我有这段代码旨在将字符串从 Spinner 项转换为整数,以便在应用程序的另一部分使用。当我在 switch case 中有常量字符串时,这很有效,但后来我想将这些硬编码的字符串移动到 Strings.xml 资源中以将它们与逻辑分开。这就是我遇到麻烦的地方,因为 Java 希望字符串保持不变。

我试图使字符串最终化,但没有任何区别。所以我的问题是,是否有可能以某种方式从资源常量中生成字符串,以使它们在 switch case 中可用,就像下面的代码 sn-p 中的那样?

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;
    }

}

【问题讨论】:

  • 您需要 编译时间常数 用于您的案例标签

标签: java android string constants


【解决方案1】:

没有办法解决“需要常量表达式”编译错误。 Java 语言规范要求开关表达式是编译时常量表达式

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


JLS 对此主题的说法如下:

JLS §14.11:

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

JLS §15.28:

常量表达式是表示原始类型值或String 的表达式,它不会突然完成并且仅使用以下内容组成:

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

JLS §14.12.4:

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


为什么?

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

  2. 在字符串和枚举情况下,使用编译器/运行时系统根据情况构造的代码/数据结构执行切换。如果 case 不是常量,则编译器无法构造它们。

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

前两个可以被视为“只是”实现细节。最后一点更为根本。放宽规则会破坏语言。

【讨论】:

    【解决方案2】:

    一切皆有可能

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

    【讨论】:

    • 是的,我知道这是可能的。我的问题更具体地说是关于使用字符串资源来避免代码中的硬编码字符串文字。
    • 你的意思是像第一种情况?
    • 是的,就像你的第一个案例一样。但是,该代码不起作用,因为它不是常量表达式。这让我们回到了我最初的问题。
    • constant expression required
    • 您是否将这个<string name="three">three</string> 放入您的strings.xml 文件中?
    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2020-07-21
    相关资源
    最近更新 更多