为什么不能在java交换机中使用公共静态最终字符串
java支持切换字符串,但在case字段中,如何使用常量字符串? 像这样:为什么不能在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
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>不被认为是常数,也不能用于交换。