常量声明之间的区别

时间:2014-12-18 03:59:12

标签: java

我有一个在交换机案例中使用常量的两个java片段:

final Integer s1=5;
int x=5;
switch(x){
    case s1:  **<== causes complilation error..**
        System.out.println("hello");
}

下面的代码工作正常,因为s1被视为常量,而上面的代码不起作用。

final int s1=5;
int x=5;
switch(x){
    case s1: <=== ok s1 is constant
        System.out.println("hello");
}

上述两个声明之间有什么区别?

2 个答案:

答案 0 :(得分:3)

Java语言规范defines

  

SwitchLabel:

     
      
  • case ConstantExpression:
  •   
  • case EnumConstantName:
  •   
  • 默认:
  •   

也就是说,case标签必须是枚举常量的名称,或者是ConstantExpression。规范还says

  

常量表达式是表示基本类型值的表达式或不突然完成的字符串,仅使用以下内容组成:

也就是说,Integer不是编译类型常量表达式,因此不能用作案例标签。

答案 1 :(得分:2)

switch语句仅适用于基本类型以及StringenumInteger既不是原始类型,也不是Stringenum,因此它会产生编译错误。