2017-07-26 104 views
0

java支持切换一个字符串,但是在case字段中,如何使用一个常量字符串? 像这样:为什么public static final string不能用在java开关

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; 
+4

请显示'l'的定义,它是类和'LOG_FIELD_TIME'的值。如果你真的想在这里切换,为什么不枚举? –

+1

为什么你的代码不能正常工作?似乎在这里工作。 http://ideone.com/tiS3RA –

+1

我做了一个快速测试。如果'l'是对'ClassOfL'的引用,并且''ClassOfL''中的'LOG_FIELD_TIME'被定义为'private static final String',那么'case ClassOfL.LOG_FIELD_TIME:..'应该可以工作。 –

回答

2

(幸得EJP的答案)

JLS,它提到,你把情况下表达必须是一个常量表达式。

有不同形式的常量表达式和字符串的常数是在列表中:表单类型名的

合格的名称(§6.5.6.2)。 引用常量变量(§4.12.4)的标识符。

从你的代码,它给出了一个暗示,l.LOG_FIELD_TIME不符合要求,因为l不是TypeName(由for (String s : l) {暗示)。如果LOG_FIELD_TIME确实是static final字段,则应该使用ClassNameOfL.LOG_FIELD_TIME来代替,并且该东西应该可以工作。

+1

借用@ cricket_007的[示例](https://stackoverflow.com/questions/45316277/why-public-static-final-string-can-not-used-in-java-switch#comment77595204_45316277):http:/ /ideone.com/DFNu7w – shmosel

+0

谢谢。将l.LOG_FIELD_TIME更改为PhxLog.LOG_FIELD_TIME,它可以工作。 – soma

+0

考虑接受答案,如果它回答你的问题。 –

-2

如何使用,而不是一个 “XXXX”

你可以不是一个常数。 JLS 14.11

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

static final String的名称不是一个常量表达式。正如它所说,你可以使用enum

+0

所以我们现在下调了JLS? – EJP

+0

只是在这里好奇。使用静态最终字符串是否与'case Math.PI'不同? –

+0

@ cricket_007我看不出如何,因为措辞。 – EJP

相关问题