昨天早上通过远程的方式 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 语句也太老土了吧相关推荐

  1. 技术大佬:我去,你写的 switch 语句也太老土了吧!

    作者 | 沉默王二 来源 | CSDN 博客专家 出品 | CSDN(ID:CSDNnews) 昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到 ...

  2. 我去,你写的 switch 语句也太老土了吧

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 昨天早上通过远程的方式 review 了两名新来同事的代码,大部分 ...

  3. switch java 语法_Java编程—switch语句语法详解

    5.3.2 switch语句 switch关键字的中文意思是开关.转换的意思,switch语句在条件语句中特别适合做一组变量相等的判断,在结构上比if语句要清晰很多. switch语句的语法格式为: ...

  4. 输出 100 万字、维护 3 个GitHub 项目,技术大佬的 2019 太燃了……

    一个技术大佬的 2019 by 实验楼课程作者:十三 日常工作之外,2019 年这一年的时间里我制作并上线了四个付费专栏,输出了近 100 万字,在 GitHub 开源平台上维护了 3 个开源项目,同 ...

  5. 技术大佬:今年还学Python,傻了吧? 网友:就你敢说!

    随着AI的兴起,Python彻底火了.据Stack Overflow调研报告:Python的月活用户已超越了Java.成为第一,全民Python已为"大势所趋". 那么,程序员有必 ...

  6. 海归技术大佬:硅谷科技公司到底牛在哪里?讲透“奈飞文化”8个原则!

    作者| Mr.K 来源| 技术领导力(ID:jishulingdaoli) 昨天,老K跟几位独角兽公司的技术大佬,云喝茶,因为疫情的原因不好线下聚会,只能改成线上了.我们聊到一个话题,硅谷的科技公司到 ...

  7. 技术总监到底要不要写代码?

    https://www.toutiao.com/a6698485180505522695/ 这是一个非常敏感的话题,每次谈论到技术总监要不要写代码的时候,总会引起一片争论. 有的程序员说技术总监如果不 ...

  8. 【原创】技术人员如何去面试?

    [原创]技术人员如何去面试? 作者:heiyeluren 时间:2013/03/09 微信:heiyeluren2012  (欢迎关注微信获取更多技术相关资讯) 微博:http://weibo.com ...

  9. 推荐一位北航技术大佬,手握 GitHub 14000 颗小星星

    今天给大家推荐一位技术大佬:木易杨,人称杨哥,北京航空航天大学毕业,计算机硕士,资深前端工程师,掘金大佬一枚.之前在网易工作,现在国内某出行领域独角兽公司做基础架构研发. 深耕前端 2 年多,如同开挂 ...

  10. 公司停电,程序员去网吧写代码;iPhone 14将于北京时间9月8日发布;GitLab修复一个关键远程代码执行漏洞|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

最新文章

  1. 【Java基础总结】IO流
  2. python os.walk如何还原所有路径名_python使用os.listdir和os.walk获得文件的路径
  3. maven下载其源代码包并关联
  4. 卷积为什么如此强大?一文全解深度学习中的卷积
  5. Object 的静态方法之 defineProperties 以及数据劫持效果
  6. 苹果要完!传iOS 13将不兼容iPhone 6、iPhone SE和iPhone 5s等机型
  7. android demo示例代码,Android Service demo例子使用详解(示例代码)
  8. 【java】超市购物小程序
  9. Realtek sdk5.1.0T出现can‘t open file “drivers/net/wireless/rtl8192cd/Kconfig-usb“
  10. 2019版PHP自动发卡平台源码
  11. signature=71820b070a82d48c44cc938baccfcfc9,基于集成神经网络的离线手写签名鉴别方法
  12. 普渡大学计算机科学师生比,公立常春藤高校普渡大学,附申请要求+录取难度!...
  13. 腾讯android一键root工具,腾讯一键Root工具
  14. VM打开虚拟机VMX进程已提前退出错误及解决办法
  15. TIA Protal 精智面板中的动画外观
  16. 快手信息流投放平台:快手电商宣告成年
  17. [SCOI2014]方伯伯的玉米田
  18. HSV(HSB)和HSL颜色空间
  19. 2019年的软件百强企业榜单
  20. 零基础开发WIFI设备(esp8266)

热门文章

  1. 银行业务模拟系统的设计与实现(C语言)
  2. GDAL 读取和保存 Grd 文件
  3. FLStudio21无需切换中文语言fl下载中文免费版
  4. linux office转换pdf
  5. 对傅里叶变换FFT性质的理解 平移 旋转 缩放
  6. 现代Web发展趋势和前沿技术综述
  7. 网页报表等无法打印提示网页上有错误的解决办法
  8. 支持全球科研抗疫,艾柏森成功研发Omicron变异株重组蛋白
  9. SGX软硬件栈(零)——基本介绍
  10. 栈:后进先出的线性表