Java 7:Switch和OCP认证

日期: 2011-12-19 作者:Cameron McKenzie & Sal Pece翻译:张培颖 来源:TechTarget中国 英文

首先,我讨厌switch声明。这真是个要命的程序,我经常看到初级程序员围着一个switch声明忙乎,我一直坚信存在更为面向对象的方法来处理这个问题。但是不管喜欢还是讨厌,switch声明确实是Java语言的一部分,也是Oracle Certified Professional考试的一部分,因此你需要知道如何使用,尤其是想获得OCP。   Java 7和Switch声明   在Java 7之前,switch必须是non-long或者integer类型(byte/Byte, short/Short, char/Character and int/Integer),或者是枚举类型。

因此,基本的swi……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

首先,我讨厌switch声明。这真是个要命的程序,我经常看到初级程序员围着一个switch声明忙乎,我一直坚信存在更为面向对象的方法来处理这个问题。但是不管喜欢还是讨厌,switch声明确实是Java语言的一部分,也是Oracle Certified Professional考试的一部分,因此你需要知道如何使用,尤其是想获得OCP。

  Java 7和Switch声明

  在Java 7之前,switch必须是non-long或者integer类型(byte/Byte, short/Short, char/Character and int/Integer),或者是枚举类型。因此,基本的switch声明如下:

以下是引用片段:
public class IntSwitch { 
  public static void main(String[] args) { 
  
    int numberOfPlayers = 6; 
    String sport = null; 
  
    switch (numberOfPlayers) { 
      case 1: 
        sport = "tennis"; 
        break; 
        case 6: 
        sport = "volleyball"; 
        break; 
      case 9: 
        sport = "baseball"; 
        break; 
      default: 
        sport = "redrover"; 
      break; 
    } 
      System.out.println("You're playing " + sport); 
  } 
}

  上面的代码打印出:You're playing volleyball

  有趣的是你不能长时间开启。尝试一下下面的片段:

以下是引用片段:
long sport = 0; 
switch (sport) {}

  将会生成编译时间错误,如:Cannot switch on a value of type long. Only convertible int values, strings or enum constants are permitted

  String上的Switch

  Java 7中心的功能时你可以在String上进行switch:

以下是引用片段:
public class StringSwitch { 
  public static void main(String[] args) { 
  
    int numberOfPlayers = 0; 
    <B>String sport = "volleyball";</B> 
  
    switch (sport) { 
      case "tennis": 
        numberOfPlayers = 1; 
        break; 
      case "volleyball": 
        numberOfPlayers = 6; 
        break; 
      case "baseball": 
        numberOfPlayers = 9; 
        break; 
    } 
    System.out.println(numberOfPlayers + " players are needed."); 
  } 
}

  这个例子中,代码连接了运动的名称,其类型是String,初始化int变量名为numberOfPlayers取决于switch声明中符合的实例情况。当编译和执行时,代码打印出:需要6个队员(6 players are needed.)。

  此外,你可以把例子放在一起,在多种情况下进行初始化;请看下面的例子,String sport初始化是” hockey”:

以下是引用片段:
public class StringSwitch { 
  public static void main(String[] args) { 
  
    int numberOfPlayers = 0; 
    <B>String sport = "hockey";</B> 
  
    switch (sport) { 
      case "tennis": case "pingpong": case "badminton": 
        numberOfPlayers = 1; 
        break; 
      case "volleyball": <B>case "hockey":</B> 
        numberOfPlayers = 6; 
        break; 
      case "baseball": case "softball": 
        numberOfPlayers = 9; 
        break; 
    } 
    System.out.println(numberOfPlayers + " player(s) are needed."); 
  } 
}

  在这个switch声明中,numberOfPlayers变量得到的初始化数字是6,随后打印出:需要6个队员(6 players are needed.)。

  String且仅是String

  另一个需要在Java 7中提示的是,你可以在String变量中进行switch,但是变量必须被String参照,不是简单地作为String初始化,所以下面的代码会失败:

以下是引用片段:
public class StringSwitch { 
  public static void main(String[] args) { 
  
    int numberOfPlayers = 0; 
    Object sport = "hockey"; 
  
    switch (sport) { 
      case "tennis": case "pingpong": case "badminton": 
        numberOfPlayers = 1; 
        break; 
      case "volleyball": case "hockey": 
        numberOfPlayers = 6; 
        break; 
      case "baseball": case "softball": 
        numberOfPlayers = 9; 
        break; 
    } 
    System.out.println(numberOfPlayers + " player(s) are needed."); 
  } 
}

  在这个例子中,将会出现这样的错误:Cannot switch on a value of type Object. Only convertible int values, strings or enum constants are permitted

  Switch声明空引用

  你需要小心的是,在switch声明中通过一个空值。Switch声明仅仅同基础原语类型工作的时候不是问题,但是同封装类工作的时候,很可能空对象就混进去了。

  关于null和switch你需要知道两个关键的事情。首先,如果你在switch声明中通过一个空值,就会在运行时得到NullPointerException。其次,在switch中,无法测试null case。尝试增加一个case null:将会生成下面的编译异常:case expressions must be constant expressions
因此,下面的代码用不同的方法都完全失败了:

以下是引用片段:
int numberOfPlayers = 0; 
String sport = null; 
switch (sport) { 
  case null:  
    numberOfPlayers = -1; 
    break; 
  case "tennis": case "pingpong": case "badminton": 
    numberOfPlayers = 1; 
    break; 
  case "volleyball": case "hockey":  
    numberOfPlayers = 6; 
    break; 
  case "baseball": case "softball": 
    numberOfPlayers = 9; 
  break; 

System.out.println(numberOfPlayers + " player(s) are needed.");

  代码将会编译失败,完全是由于null case,就算是移除了,运行时,null String仍会触发NullPointerException。所以你要记住:避免空值。尤其是在switch声明中。

翻译

张培颖
张培颖

云计算网站编辑

相关推荐