带字符串的 Switch 语句

Switch statement with string

我尝试了以下代码:

String str = "Str1";

switch(str) {
    case Constants.First_String  : System.out.println("First String");
                                   break;
    case Constants.Second_String : System.out.println("Second String");
                                   break;
    default : System.out.println("Default String");
}

而我的 Constants class 是,

public class Constants {
    public static String First_String  = "Str1";
    public static String Second_String = "Str2";
    public static String Third_String  = "Str3";
}

我得到一个编译错误,

Exception in thread "main" java.lang.Error: Unresolved compilation problems: case expressions must be constant expressions

但是当我尝试使用以下代码时,

switch(str){
    case "Str1" : System.out.println("First String");
                  break;
    case "Str2" : System.out.println("Second String");
                  break;
    default : System.out.println("Default String");
}

没有编译错误,并将输出打印为,

First String

我的问题是,为什么在第一种情况下会出现编译错误。我该如何解决它。

"Str1" 是一个编译时常量,这就是为什么 case "Str" 没问题。

但是,从First_String的定义我们可以看出它不是一个常量,因为它可以随时改变它的值。

你可以尝试设置为final:

public static final String First_String  = "Str1";

一个constant expression is not the same as a static member. Even a static member can be changed by code... It needs to be final to be considered a constant expression:

来自the JLS

A compile-time constant expression is an expression...

  • Simple names (§6.5.6.1) that refer to constant variables (§4.12.4).

所以

case "Something":

可以。原样

public static final String ME = "Other";
...
case ME:

最后,enum 也可以用在 switch-case 语句中。

干杯,

你的 Constants class 中的字符串必须声明 final 才能被视为常量。

如果它们被声明为 final,编译器知道它们永远不会改变,因此可以将它们视为常量表达式。如果它们没有被声明final,在程序执行期间它们可能被重新分配给不同的字符串,所以它们不是常量。

改变

public static String First_String  = "Str1";

public static final String First_String  = "Str1";

现在它是一个常数。

您必须将 Constants 声明为 final

public static final String First_String  = "Str1";
public static final String Second_String = "Str2";
public static final String Third_String  = "Str3";

或在if-else语句中转换switch

在 Eclipse 中
您可以使用以下方法将 switch 语句快速转换为 if-else 语句:

将光标移动到 switch 关键字并按 Ctrl + 1 然后 select

Convert 'switch' to 'if-else'.