大猿软件吧 关注:16贴子:151
  • 0回复贴,共1

王夫子说java:switch坑你没商量

取消只看楼主收藏回复

switch我相信大家在使用java的时候,一定被switch分支语句坑过,没有坑过的,可能是你还没用switch写过代码。坦白讲,我在工作中被switch坑过两次,一次是线上bug,一次是测试阶段遇到的,线上那次是忘记在switch里写default,导致了不该出现的提示语句,虽然,这不是很严重的bug,但这次让我重新认识了switch语法,我就默默的下定决心,再也不会使用switch写代码。
当然,switch还有其它的坑,比如忘记在case里写break语句,导致switch穿透,穿透这个情况如果一旦出现,后果是相当严重的,也就是说,一旦某个case匹配上,恰好这个case你忘记写上break语句,好戏就开始上演了,假如后面还有多个case语句,那么,程序会继续执行switch里的case,这个时候就不关心case能否匹配上,就直接执行里,一直当程序遇到break语句或者return语句才会跳出switch代码库,大家读到这里,是不是惊了一身冷汗,switch竟然还有如此隐晦的特性,这个特性如果不幸你遇到了,相信你会记它一辈子。况且,在IDE中编写switch代码,如果不写default,不写break语句,IDE不会提示的,但我不知道findbug插件会不会检测到这样的潜在问题,大家可以试一下。当然,有的人需要switch提供的穿透特性,那就另当别论了,祝他好运吧,希望他用的开心快乐。
就在上周我在讲分支语句的时候,在讲到switch语句时,我对学员说switch能够接收的类型有基本类型、String类型和枚举类型,后来,有学员私聊我,说我的switch讲的有错误,switch不能把基本类型全部接收,比如long, float, double, boolean这几个就不行,我晚上回家试了一下,的确是不行的。虽然被学生们打脸,打的啪啪直响,但打的很舒服,能够找出我讲课的错误,说明他是真的用心在听了,而且是真的练习了。这样的学习方式效果一定不会差的,而且,我在招学员的时候,就跟他们说过,编程是个没有权威、突出个性的行业,三人行必有我师用在编程上再合适不过了,软件的领域很广阔,每个人专注的地方不同,擅长的也不相同,不可能把每个分支都掌握的很到位,有些人对算法有研究,有些人对搜索有研究,有些人对大数据有研究,有些人对编译器有研究,有些人对通信有研究....等等,只要你在某一个分支研究的多,付出时间多,你就会比别人在这个领域优秀的多。
最后我想说的是,作为一个编程语言,它要提供很多中语法来满足不同业务的不同人群的需要,比如分支,java里面有if,if...else,if...else if ...,switch...case语句,虽然java提供了多重分支语句,但是我们不一定每个都要用,我们要选择最好用的来用,比如我更倾向于使用if,能用if搞定的,我绝不会使用if...else或者switch...case语句,尤其不会使用switch...case语句,if是最简单,业务最简单,不容易出现bug,switch太坑爹,我坚决不会使用,虽然有人说switch语法优雅性能高,但我更看重代码的质量和稳定性,再说那一点点的性能和说不上来的优雅(反正我看不出来switch哪里优雅)不足以让我使用出错率极高的switch,所以,在我上课的时候,我也是这么对学员讲的,使用简单靠谱的代码完成功能就是最好的。
而且我相信,后面的课程我可能还会有地方讲的不对的地方,还会被学员们啪啪啪的打脸,不过,这脸打的我不疼,多抽两下,我会更舒服些。加油了,童鞋们。


1楼2017-03-16 21:20回复