java switch case中的常量表达式要求(字段是final和initialized)

时间:2018-01-10 10:55:54

标签: java

public static final Integer SAMPLE = 100;

public static void doSomething(int errorCode) {
    switch (errorCode) {
        case SAMPLE:
            // ...
           break;
    }
}

我需要持续表达。如果我将SAMPLE更改为int它将得到修复。为什么?

3 个答案:

答案 0 :(得分:8)

语言规范的相关部分位于JLS Sec 14.11

  

每个案例标签都有一个案例常量,可以是常量表达式,也可以是枚举常量的名称。

这解释了为什么你不能使用Integer值:它不是constant expression,因为它是在运行时评估的。

修复方法是将case标签更改为具有常量表达式。要了解允许的类型,请参阅规范的相同部分:

  
      
  • 与switch语句关联的每个case常量必须与switch语句的Expression(第5.2节)的类型兼容。
  •   

  

Expression的类型必须是char,byte,short,int,Character,Byte,Short,Integer,String或枚举类型(第8.9节),否则会发生编译时错误。

由于你不能拥有一个常量包装的基本类型(CharacterByteShortInteger:它们都是在运行时进行评估的),这意味着那个案例标签只能是:

  • char
  • byte
  • short
  • int
  • String
  • 枚举常数

最简单的选择是将SAMPLE的声明更改为:

public static final int SAMPLE = 100;

请注意,100位于保证缓存的Integer.valueOf范围内,因此不需要将值声明为基元:在需要盒装值的情况下,从缓存中使用一个值。

答案 1 :(得分:4)

Switch只能使用一些基元(char,byte,short,int),枚举值和字符串。

将其更改为;

public static final int SAMPLE = 100;

答案 2 :(得分:1)

实际上switch语句可以与Integer一起使用。

来源:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

case仅适用于常数值,例如原语和编译时字符串。

传递给case语句的SAMPLE字段应该是原始类型。