技术大佬:我去,你写的 switch 语句也太老土了吧
昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!”
来看看小王写的代码吧,看完不要骂我装逼啊。
private static String createPlayer(PlayerTypes playerType) {switch (playerType) {case TENNIS:return "网球运动员费德勒";case FOOTBALL:return "足球运动员C罗";case BASKETBALL:return "篮球运动员詹姆斯";case UNKNOWN:throw new IllegalArgumentException("未知");default:throw new IllegalArgumentException("运动员类型: " + playerType);}
}
看完上述代码后,你是不是会发出这样的感慨——“代码写得很好,没有任何问题啊!”是不是觉得我在无事生非,错怪了小王!但此时我要送上《了不起的盖茨比》中的一句话:
我年纪还轻,阅历不深的时候,我父亲教导过我一句话,我至今还念念不忘。 “每逢你想要批评任何人的时候, ”他对我说,“你就记住,这个世界上所有的人,并不是个个都有过你拥有的那些优越条件。”
哈哈,这句话不光是让你看的,也是给我看的。是时候冷静下来谈谈上述 switch 语句的老土问题了。
看到上图了吧,当不小心删掉 default 语句后,编译器就会报错,提示:“没有返回语句”,为了解决这个问题,我们可以新建一个 player 变量作为返回结果,就像下面这样:
private static String createPlayer(PlayerTypes playerType) {String player = null;switch (playerType) {case TENNIS:player = "网球运动员费德勒";break;case FOOTBALL:player = "足球运动员C罗";break;case BASKETBALL:player = "篮球运动员詹姆斯";break;case UNKNOWN:throw new IllegalArgumentException("未知");}return player;
}
当添加了 player 变量后,case 语句中就需要添加上 break 关键字;另外在 switch 语句结束后,返回 player。这时候,编译器并不会提示任何错误,说明 default 语句在这种情况下是可以省略的。
从 JDK 12 开始(本例使用的是 JDK 13),switch 语句升级了,不仅可以像传统的 switch 语句那样作为条件的判断,还可以直接作为一个返回结果。来对小王的代码进行改造,如下所示:
private static String createPlayer(PlayerTypes playerType) {return switch (playerType) {case TENNIS -> "网球运动员费德勒";case FOOTBALL -> "足球运动员C罗";case BASKETBALL -> "篮球运动员詹姆斯";case UNKNOWN -> throw new IllegalArgumentException("未知");};
}
够 fashion 吧?不仅 switch 关键字之前加了 return 关键字,case 中还见到了 Lambda 表达式的影子,中划线和箭头替代了冒号,意味着箭头右侧的代码只管执行无须 break。
并且,default 语句变成了可选项,可有可无,不信?你也动手试试。
新的 switch 语句足够的智能化,除了有上述的 3 个优势,还可以对枚举类型的条件进行校验。假如在 PlayerTypes 中增加了新的类型 PINGPANG(乒乓球):
public enum PlayerTypes {TENNIS,FOOTBALL,BASKETBALL,PINGPANG,UNKNOWN
}
此时编译器会发出以下警告:
意思就是 switch 中的 case 条件没有完全覆盖枚举中可能存在的值。好吧,那就把 PINGPANG 的条件加上吧。来看一下完整的代码:
public class OldSwitchDemo {public enum PlayerTypes {TENNIS,FOOTBALL,BASKETBALL,PINGPANG,UNKNOWN}public static void main(String[] args) {System.out.println(createPlayer(PlayerTypes.BASKETBALL));}private static String createPlayer(PlayerTypes playerType) {return switch (playerType) {case TENNIS -> "网球运动员费德勒";case FOOTBALL -> "足球运动员C罗";case BASKETBALL -> "篮球运动员詹姆斯";case PINGPANG -> "乒乓球运动员马龙";case UNKNOWN -> throw new IllegalArgumentException("未知");};}
}
switch 语句变成了强大的 switch 表达式,美滋滋啊!那假如一个运动员既会打篮球又会打乒乓球呢?
private static String createPlayer(PlayerTypes playerType) {return switch (playerType) {case TENNIS -> "网球运动员费德勒";case FOOTBALL -> "足球运动员C罗";case BASKETBALL,PINGPANG -> "牛逼运动员沉默王二";case UNKNOWN -> throw new IllegalArgumentException("未知");};
}
就像上述代码那样,使用英文逗号“,”把条件分割开就行了,666 啊!
不服气?switch 表达式还有更厉害的,->
右侧还可以是 {}
括起来的代码块,就像 Lambda 表达式那样。
private static String createPlayer(PlayerTypes playerType) {return switch (playerType) {case TENNIS -> {System.out.println("网球");yield "网球运动员费德勒";}case FOOTBALL -> {System.out.println("足球");yield "足球运动员C罗";}case BASKETBALL -> {System.out.println("篮球");yield "篮球运动员詹姆斯";}case PINGPANG -> {System.out.println("乒乓球");yield "乒乓球运动员马龙";}case UNKNOWN -> throw new IllegalArgumentException("未知");};
}
细心的同学会发现一个之前素未谋面的关键字 yield
,它和传统的 return、break 有什么区别呢?
先来看官方的解释:
A yield statement transfers control by causing an enclosing switch expression to produce a specified value.
意思就是说 yield 语句通过使一个封闭的 switch 表达式产生一个指定值来转移控制权。为了进一步地了解 yield
关键字,我们可以反编译一下字节码:
private static String createPlayer(NewSwitchDemo3.PlayerTypes playerType) {String var10000;switch(playerType) {case TENNIS:System.out.println("网球");var10000 = "网球运动员费德勒";break;case FOOTBALL:System.out.println("足球");var10000 = "足球运动员C罗";break;case BASKETBALL:System.out.println("篮球");var10000 = "篮球运动员詹姆斯";break;case PINGPANG:System.out.println("乒乓球");var10000 = "乒乓球运动员马龙";break;case UNKNOWN:throw new IllegalArgumentException("未知");default:throw new IncompatibleClassChangeError();}return var10000;
}
编译器在生成字节码的时候对 yield
关键字做了自动化转义,转成了传统的 break 语句。这下清楚了吧?
但是,话又说出来,那些看似 fashion 的代码也不过是把部分秀技的工作交给了编译器,还可能存在对旧版本不兼容、对队友不友好的问题——代码土点就土点呗,没准是最实用的。
“不好意思,我为昨天早上的嚣张向你道歉。。。。。。”我向小王发送了一条信息。
好了,我亲爱的读者朋友,以上就是本文的全部内容了,希望能够博得你的欢心。
最后,一定会有不少读者想要问我怎么学习 Java 的,那我干脆就把我看过的优质书籍贡献出来:
1)入门版:《Head First Java》、《Java 核心技术卷》
2)进阶版:《Java编程思想》、《Effective Java》、《Java网络编程》、《代码整洁之道》
3)大牛版:《Java并发编程》、《深入理解Java虚拟机》、《Java性能权威指南》、《重构》、《算法》
就先介绍这么多,希望对那些不知道看什么书的同学有所帮助。
对了,我介绍的这些书籍,已经顺便帮你整理好了,你可以在我的原创微信公众号『沉默王二』回复『书籍』获取哦
有收获?希望老铁们来个三连击,给更多的同学看到这篇文章
技术大佬:我去,你写的 switch 语句也太老土了吧相关推荐
- 技术大佬:我去,你写的 switch 语句也太老土了吧!
作者 | 沉默王二 来源 | CSDN 博客专家 出品 | CSDN(ID:CSDNnews) 昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到 ...
- 我去,你写的 switch 语句也太老土了吧
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 昨天早上通过远程的方式 review 了两名新来同事的代码,大部分 ...
- switch java 语法_Java编程—switch语句语法详解
5.3.2 switch语句 switch关键字的中文意思是开关.转换的意思,switch语句在条件语句中特别适合做一组变量相等的判断,在结构上比if语句要清晰很多. switch语句的语法格式为: ...
- 输出 100 万字、维护 3 个GitHub 项目,技术大佬的 2019 太燃了……
一个技术大佬的 2019 by 实验楼课程作者:十三 日常工作之外,2019 年这一年的时间里我制作并上线了四个付费专栏,输出了近 100 万字,在 GitHub 开源平台上维护了 3 个开源项目,同 ...
- 技术大佬:今年还学Python,傻了吧? 网友:就你敢说!
随着AI的兴起,Python彻底火了.据Stack Overflow调研报告:Python的月活用户已超越了Java.成为第一,全民Python已为"大势所趋". 那么,程序员有必 ...
- 海归技术大佬:硅谷科技公司到底牛在哪里?讲透“奈飞文化”8个原则!
作者| Mr.K 来源| 技术领导力(ID:jishulingdaoli) 昨天,老K跟几位独角兽公司的技术大佬,云喝茶,因为疫情的原因不好线下聚会,只能改成线上了.我们聊到一个话题,硅谷的科技公司到 ...
- 技术总监到底要不要写代码?
https://www.toutiao.com/a6698485180505522695/ 这是一个非常敏感的话题,每次谈论到技术总监要不要写代码的时候,总会引起一片争论. 有的程序员说技术总监如果不 ...
- 【原创】技术人员如何去面试?
[原创]技术人员如何去面试? 作者:heiyeluren 时间:2013/03/09 微信:heiyeluren2012 (欢迎关注微信获取更多技术相关资讯) 微博:http://weibo.com ...
- 推荐一位北航技术大佬,手握 GitHub 14000 颗小星星
今天给大家推荐一位技术大佬:木易杨,人称杨哥,北京航空航天大学毕业,计算机硕士,资深前端工程师,掘金大佬一枚.之前在网易工作,现在国内某出行领域独角兽公司做基础架构研发. 深耕前端 2 年多,如同开挂 ...
- 公司停电,程序员去网吧写代码;iPhone 14将于北京时间9月8日发布;GitLab修复一个关键远程代码执行漏洞|极客头条
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...
最新文章
- 【Java基础总结】IO流
- python os.walk如何还原所有路径名_python使用os.listdir和os.walk获得文件的路径
- maven下载其源代码包并关联
- 卷积为什么如此强大?一文全解深度学习中的卷积
- Object 的静态方法之 defineProperties 以及数据劫持效果
- 苹果要完!传iOS 13将不兼容iPhone 6、iPhone SE和iPhone 5s等机型
- android demo示例代码,Android Service demo例子使用详解(示例代码)
- 【java】超市购物小程序
- Realtek sdk5.1.0T出现can‘t open file “drivers/net/wireless/rtl8192cd/Kconfig-usb“
- 2019版PHP自动发卡平台源码
- signature=71820b070a82d48c44cc938baccfcfc9,基于集成神经网络的离线手写签名鉴别方法
- 普渡大学计算机科学师生比,公立常春藤高校普渡大学,附申请要求+录取难度!...
- 腾讯android一键root工具,腾讯一键Root工具
- VM打开虚拟机VMX进程已提前退出错误及解决办法
- TIA Protal 精智面板中的动画外观
- 快手信息流投放平台:快手电商宣告成年
- [SCOI2014]方伯伯的玉米田
- HSV(HSB)和HSL颜色空间
- 2019年的软件百强企业榜单
- 零基础开发WIFI设备(esp8266)