在Switch语句中使用Integer

时间:2012-09-26 14:19:16

标签: java switch-statement

由于各种商业原因,我想在我的一个类中保留一些静态ID。它们最初是int,但我想将它们更改为Integer,因此我可以对它们做一个等号(即MY_ID.equals(..),以避免NPE)

当我将它们更改为Integer时,我的switch语句中出现错误。 docs表示在Switch中Integer应该没问题。

引用

  

[Switch]也适用于枚举类型(在枚举类型中讨论),   String类,以及一些特定的包装类   原始类型:字符,字节,短整数和整数(在   数字和字符串)。

在下面的代码中,如果我是int,那么它就会编译。当它是Integer时,它不会说constant expression is required。我尝试过做.intValue(),但这也不起作用。

我真的很蠢吗?或完全误读docs

private static final Integer i = 1;

@Test
public void test() {
    switch(mObj.getId()){
        case i: //do something
        default: //do something default
    }

}

感谢您的任何指示。暂时我将它们保持为int并执行new Integer(myint).equals(...)

6 个答案:

答案 0 :(得分:8)

将常量更改为基本类型:

private static final int i = 1;

你会没事的。 switch只能使用基元,枚举值和(自Java 7开始)字符串。几点提示:

  • new Integer(myint).equals(...)可能是超级丰富的。如果至少有一个变量是原始的,只需执行:myint == ...。只有在与equals()包装器进行比较时才需要Integer

  • 首选Integer.valueOf(myInt)代替new Integer(myInt) - 并尽可能依靠自动装箱。

  • 常量通常使用Java中的大写情况编写,因此static final int I = 1

答案 1 :(得分:3)

case语句或枚举常量中切换require constant expressionsA constant expression is

  

表示基本类型值的表达式或不突然完成的字符串

所以整数没有资格。在您的情况下,您可以使用int或枚举(如果您的ID在编译时已知,则会有意义。)

唯一可以使用盒装类型的地方(例如整数)在switch表达式中:

switch(Integer.valueOf(1)) {
    case 1: //
}

答案 2 :(得分:3)

现在java提供了枚举,我们通常这样做:

public enum MyKey {
   i,
   j
}

...

switch(mObj.getId()){
    case i: //do something
    default: //do something default
}

答案 3 :(得分:0)

您必须在switch语句中使用常量值。

switch(mObj.getId()){
    case 5: //do something
    default: //do something default
}

答案 4 :(得分:0)

在显示的代码中,'i'是一个对象指针,而不是一个常量表达式。

答案 5 :(得分:0)

因为我在看这个......

接受的答案是:

  

switch只能用于原语,枚举值和(自Java 7起)   字符串

然而,

14.11 The switch Statement

概述了显示的开关的JavaSE7文档:

  

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

我只想澄清未来的冲浪者。