首先,我讨厌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中国
首先,我讨厌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声明中。
相关推荐
-
Java 7和错综复杂的安全和非安全类型转换
类型转换的问题之一就是有可能导致精度缺失,尤其是如果要进行转换的数字实际上超出了目标类型的范围。请看下面的代码……
-
Java 7特性:如何在项目Coin中更精确的重新抛出异常
其他语言爱好者,如Scala或Clojure总是诋毁事实,说Java太冗长、繁琐。所以,在Java7中引入大量新设施,以帮助并减少应用程序开发者需要编写的代码,并不太另人吃惊。
-
JRuby和Java 7 我们可以期待什么
Java 7已经粉墨登场了,这次带来的新功能感觉有些普普通通,当然还是有几个重要改进。那么对于在Java 7上运行的JRuby,我们能够期待些什么呢?
-
红帽中间件鲜为人知的另一面
红帽公司的副总裁兼中间件事业部总经理Craig Muzilla是个大忙人。尽管红帽以Linux发行版名扬天下,但该公司依托JBoss搞起了一块主要的企业软件业务。