在Switch Case Java中编译时间常量用法

时间:2013-12-20 12:26:47

标签: java string switch-statement

case用法规则说:

  1. 案例表达式必须评估为Compile Time Constant

  2. case(t)表达式必须与switch(t)的表达式相同,其中t     是类型(String)。

  3. 如果我运行此代码:

    public static void main(String[] args) {
        final String s=new String("abc");
        switch(s)
        {
           case (s):System.out.println("hi");
        }
    
    }
    

    它将编译错误视为:"case expression must be a constant expression" 另一方面,如果我使用final String s="abc";进行尝试,它可以正常工作。

    据我所知,String s=new String("abc")是对堆上的String对象的引用。而s本身就是一个编译时常量。

    这是否意味着final String s=new String("abc");不是编译时间常量?

6 个答案:

答案 0 :(得分:2)

在Java SE 7及更高版本中,您可以在switch语句的表达式中使用String对象。

您只能在案例中使用常量表达式而不能使用变量。

使用构造函数创建String不被视为常量。

答案 1 :(得分:2)

使用此,

    String s= new String("abc");
    final String lm = "abc";

    switch(s)
    {
       case lm:
           case "abc": //This is more precise as per the comments
           System.out.println("hi");
           break;
    }

根据documentation

  

基本类型或类型String的变量,即final和   用编译时常量表达式(第15.28节)初始化,是   称为常量变量

问题是您的代码final String s= new String("abc");没有初始化常量变量。

答案 2 :(得分:1)

它不认为new String()是常量(即使String是不可变的)。

试试这个:

public static void main(String[] args)
{
    final String s = "abc";
    switch (s)
    {
        case (s):
            System.out.println("hi");
    }
}

编辑:我猜你的switch (s)是一个拼写错误,没有多大意义。

另外,如果你在switch语句中使用常量,那么将它们作为常量字段提取可能会更加清晰,例如: private static final String s = "abc";。如果你使用枚举而不是字符串,甚至更清楚,但我意识到这并不总是可行的。

答案 3 :(得分:0)

问题是你可以在variable S的任何地方更改switch的值,这样就可以执行所有cases。所以它会给出"case expression must be a constant expression"错误,如果变量是final,那么它的值就不能改变。

修改

case中,您需要具有编译时常量,final变量被视为运行时常量。由于最终变量可能会被延迟初始化而编译器无法确定。

答案 4 :(得分:0)

问题在于您尝试切换测试案例变量s。  哪个,正在抛出错误。 "case expression must be a constant expression"。这与s本身无关......但使用s作为案例变量。理解?

以下是使用可正常工作的相同变量的示例。

private void switchTest() {
    final String s = new String("abc");
    switch (s) {
        case "abc":
            System.out.println("This works fine... woohoo.");
            break;
        default:
            System.out.println("Do something default.");
    }

}

答案 5 :(得分:-1)

如何将int或其他原始数据类型作为switch语句的编译时常量?

public class MainClass{ 
    public static void main(String[] argv){ 
        final int a = 1;
        final int b; 
        b = 2; 
        int x = 0; 
        switch (x) { 
            case a: // ok 
            case b: // compiler error 
        } 
    } 
}