【问题标题】:Why is it that not all final constant strings are created equal in java [duplicate]为什么并非所有最终常量字符串在java中都是相等的[重复]
【发布时间】:2016-01-18 23:24:10
【问题描述】:

我今天在 Java 中做了一个疯狂的发现,我想知道为什么。

以下 switch 语句有效

public static final String OTHER_OTHER = ”.otherOther”;
…
        switch (SWITCHER) {
            case Dogs.OTHER_OTHER:
                doMyWork(intent);
                break;
            default:
                ...;
        }

编译失败

public static final String OTHER_OTHER = Dogs.class.getPackage().toString()+”.otherOther”;
…
        switch (SWITCHER) {
            case Dogs.OTHER_OTHER:
                doMyWork(intent);
                break;
            default:
                ...;
        }

两个 sn-ps 之间的唯一区别在于我如何构造常量 OTHER_OTHER

第二个 switch 语句抱怨 OTHER_OTHER 不是常量。我正在使用final 创建一个字符串。

【问题讨论】:

  • OTHER_OTHER 是否在两者中评估为相同的值。
  • 我不明白这个问题。我正在使用final String 创建一个字符串,这不会使它成为一个常量吗?
  • “不工作”是什么意思?不编译?产生意想不到的结果?
  • 很难找到,但 OP 确实说编译器会拒绝常量声明。
  • 看起来对Java一无所知的人否决了我的问题。感谢任何纠正并投赞成票的人。

标签: java android string switch-statement constants


【解决方案1】:

Dogs.class.getPackage().toString() 不是常量,它使用反射 API 在运行时通过类加载器检索包。所以这些例子是不等价的。

【讨论】:

  • 您可能会补充说,常量值必须在编译时可解析,并且非工作版本中的表达式要到运行时才能知道。
  • 嗯,它在运行时是“恒定的”。但它不是编译时常量表达式。
  • @JimGarrison 我认为说一个表达式只有在编译时可以解析时才被认为是常量是更正确的。
  • @Thilo 这不是一成不变的,我见过人们用自定义类加载器做一些疯狂的事情
  • 我在引号中的“常数”是指“在最初计算后永不改变”(这里就是这种情况,因为该字段是最终的,并且是许多人认为的常数)。但这没关系。要按照 JLS 保持不变,它需要在编译时解决。 switch 语句通过将预先计算的哈希码内联到类文件中来利用它。
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
相关资源
最近更新 更多