为什么在Java中'final String'初始化为String.toString()不被视为常量

时间:2016-09-05 16:25:31

标签: java

我用Java编写了以下代码,运行良好:

public class test {
    public static void main(String[] args) {
        final String s1 = "s1" ;
        final String s2 = "s2" ;

        String s = "s1" ;
        switch(s) {
            case s1 : System.out.println("s1") ;
                break ;
            case s2 : System.out.println("s2") ;
                break ;
        }
    }
}

但是当我写下面的代码时:

public class test {
    public static void main(String[] args) {
        final String s1 = "s1".toString() ;
        final String s2 = "s2".toString() ;

        String s = "s1" ;
        switch(s) {
            case s1 : System.out.println("s1") ;
                break ;
            case s2 : System.out.println("s2") ;
                break ;
        }
    }
}

我收到以下错误:

test.java:8: error: constant string expression required
                    case s1 : System.out.println("s1") ;
                         ^
test.java:10: error: constant string expression required
                    case s2 : System.out.println("s2") ;

我正在寻找解释,因为我无法理解为什么第二个代码会给我这个错误。

1 个答案:

答案 0 :(得分:10)

因为"s1".toString()不是编译时常量表达式。只有编译时常量(或enum常量名称)才能用作switch语句中的标签。有关构成常量表达式的规则,请参阅Java Language Specification, Section 15.28。 (有关switch语句的规则,请参阅JLS §14.11。)