为什么不能在java交换机中使用公共静态最终字符串

为什么不能在java交换机中使用公共静态最终字符串,java,Java,java支持切换字符串,但在case字段中,如何使用常量字符串? 像这样: PhxLog l = new PhxLog(); for (String s : l.FIELDS) { Object v = mapBaseData.getData().get(s); switch (s) { case l.LOG_FIELD_TIME: // this is wrong, but how to use a c

java支持切换字符串,但在case字段中,如何使用常量字符串? 像这样:

PhxLog l = new PhxLog();        
for (String s : l.FIELDS) {
        Object v = mapBaseData.getData().get(s);
            switch (s) {
                case l.LOG_FIELD_TIME:   // this is wrong, but how to use a constant instead of a "xxxx"
                    l.setTime((String)v);
                    break;
如何使用常量而不是“xxxx”

你不能:

每个case标签都有一个case常量,它是常量表达式或枚举常量的名称

静态最终字符串的名称不是常量表达式

正如上面所说,您可以使用
枚举。

(这要归功于EJP的回答)

从中,它提到了您在case中输入的表达式需要是一个常量表达式

常量表达式有不同的形式,字符串包含在列表中:

格式TypeName的限定名(§6.5.6.2)。标识符 参考恒定变量(§4.12.4)


从您的代码中,它提示
l.LOG\u FIELD\u TIME
不满足要求,因为
l
不是
TypeName
(由
提示为(字符串s:l){
)。如果
LOG\u FIELD\u TIME
确实是一个
静态最终
字段,您应该使用
ClassNameOfL.LOG\u FIELD\u TIME
,事情应该可以正常工作。

请显示
l
的定义,它是类和
LOG\u FIELD\u TIME
的值。如果您真的想在这里切换,为什么不枚举?为什么您的代码不能正常工作确实?在这里似乎有效。我做了一个快速测试。如果
l
是对
ClassOfL
的引用,并且
LOG\u FIELD\u TIME
ClassOfL
中定义为
私有静态最终字符串,那么
case ClassOfL.LOG\u FIELD\u TIME:…
应该有效。没有更多信息,我们无法给出正确答案。@KevinAnderson仅当它指a时。所以我们现在否决JLS?这里很好奇。使用静态final字符串是否不同于,比如说
case Math.PI
?@cricket\u 007,考虑到该措辞,我看不出如何。只是好奇的是,它不是
ClassName。FIELD\u NAME
一个常量表达式,如果
FIELD\u NAME
被声明为
静态final?从您引用的JLS链接:
格式TypeName的限定名称(§6.5.6.2)。表示常量变量(§4.12.4)的标识符“/代码”也被认为是常量表达式,JLS在哪里说“代码>静态最终字符串变量不能作为常量表达式?借用@ CRKETETY07的:谢谢。将L.LogiFieldTimeto PHXLog.LogiFieldTyt,它起作用。如果回答了您的问题,请考虑接受答案。De>公共静态最终字符串项= AsHeNEnUn.NAME()/CONT>不被认为是常数,也不能用于交换。