深入剖析 Java 新特性
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
16539 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 23 讲
深入剖析 Java 新特性
15
15
1.0x
00:00/00:00
登录|注册

07 | switch匹配:能不能适配不同的类型?

你好,我是范学雷。今天,我们聊一聊 switch 的模式匹配。
switch 的模式匹配这个特性,在 JDK 17 中以预览版的形式发布。按照通常的进度,这个特性可能还需要两到三个版本,才能最终定稿。
这个特性很简单,但是非常重要,可以帮助我们解决不少棘手而且重要的问题。我们不妨在定稿之前,就试着看看它。
前面,我们讨论了类型匹配和 switch 表达式。那 switch 的模式匹配又是什么样子的呢?为什么说 switch 的模式匹配非常重要?我们还是通过案例和代码,一步一步地了解 switch 的模式匹配吧。

阅读案例

在面向对象的编程语言中,研究表示形状的类,是一个常用的教学案例。今天的阅读案例,会涉及到表示形状的接口和类的定义,以后,我还会给出一个使用案例。通过这个案例,我们可以看到面向对象设计的一个代码在维护和发展时的难题。
假设我们定义了一个表示形状的封闭类,它的名字是 Shape;我们也定义了两个许可类:Circle 和 Square,它们分别表示圆形和正方形。下面的代码,就是一个可供你参考的实现方式。
public sealed interface Shape
permits Shape.Circle, Shape.Square {
record Circle(double radius) implements Shape {
// blank
}
record Square(double side) implements Shape {
// blank
}
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JDK 17中引入了具有模式匹配能力的switch特性,为面向对象编程带来了重要的改进。该特性允许测试多个模式并执行特定操作,解决了兼容性问题和提高了多情景处理性能。文章通过一个形状表示案例展示了在升级版本时可能出现的兼容性问题,以及基础类库和扩展类库之间的沟通困难。作者提出了使用具有类型匹配能力的switch表达式来解决这些兼容性问题的思路。具有模式匹配能力的switch提升了数据类型匹配能力,支持空引用的匹配,可以简洁、安全地表达复杂的面向数据的查询。此外,文章还掐掉了使用default情景的必要性,并探讨了具有模式匹配能力的switch对性能的改进。总的来说,该特性对于提高编码效率、降低代码错误具有重要意义。文章还提到了一些面试问题和思考题,鼓励读者深入思考和实践。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Java 新特性》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • Jagger Chen
    置顶
    1. 匹配情景的支配地位,第一条语句支配了第二条语句 case Shape.Rectangle r -> false; case Shape.Rectangle r && r.length() == r.width() -> true; 2. 戒备模式的匹配情景 https://docs.oracle.com/en/java/javase/17/language/pattern-matching.html Shape.Rectangle r && r.length() == r.width() 替代了 case Shape.Rectangle r -> { if (r.length() == r.width()) { yield true; } yield false; }

    作者回复: 我要点赞把这个回答置顶。 小伙伴们,让更多的同学看到这个留言吧!

    2021-12-01
    11
  • bigben
    就喜欢这种某地方做了修改可以检测影响其他地方的特性,代码改起来也放心多了。

    作者回复: 改代码太难了,这种特性确实招人喜欢。

    2021-11-29
    1
  • Catherine
    请问第六讲switch表达式不是没有default会编译错误吗?为什么在这一讲里没有default情景不会报错呢?

    作者回复: 请再想想穷举的概念。

    2022-10-09归属地:美国
  • 松松
    用jshell尝试了一下不覆盖null算不算穷举,答案是同样算,不过传进null的时候会空指针。

    作者回复: 是的。

    2021-12-06
  • Hugo
    哇哇哇!!!Java 是世界上最最最好的编程语言[好的] 不接受任何反驳

    作者回复: 哈哈,淡定些

    2021-12-04
  • Jxin
    这个 switch表达式 很香啊,感觉可以用来代替 map策略模式 了。虽然相对于 map策略模式 多了每次新增策略时要追加 case ,但基于编译期的检查,其实是能感知到的,所以只要能发包就不会漏(多包一层给调用侧也就隔离了散弹式修改的可能)。但是,原本被map策略模式隐掉的路由或则映射关系就再次显示表达了,我觉得这个显示表达所有路由关系的价值完全可以覆盖每次追加一处(可感知变动)修改的成本。

    作者回复: 而且,追加的需求还能感知到,这就太棒了!

    2021-12-01
    2
  • 许灵
    https://github.com/XueleiFan/java-up/pull/11, 现在的代码库有点问题,主要是新特性加了之后。需要开启module, 有一些代码不符合要求,本次作业答案,已经在文章中了。使用类型的匹配主要是为了更早的,自动地发现问题, 而不是等出问题了去定位问题。

    作者回复: 谢谢你发现了这个问题:“现在的代码库有点问题”。 有一些东西遗漏了,加进来了。你更新一下再试试看,还有没有问题。PR我稍后再看。

    2021-12-01
  • 许灵
    https://github.com/XueleiFan/java-up/pull/11

    作者回复: 代码很干净。 有一个小小的建议,放在PR的评论里了。

    2021-12-01
  • ABC
    思考题: 1.首先可以去掉代码头部的if判断 2.在switch中整合null,default,如果代码作为类库发布,此处可以抛出异常,告知调用者必须明确参数。如果作为业务代码,则可以默认某个类型为返回值。 PS.手机阅读,未运行代码,如有问题还请指正。谢谢老师。

    作者回复: 两个点都没有问题,但是没有找出来代码里的错误。switch匹配有两个特点,我们没有讨论。这个题,需要进一步阅读switch 的模式匹配的官方文档,才能做的出来。

    2021-12-01
    2
  • ABC
    第五讲的时候简单用了一下,但有一个疑惑,如果有三个子类,单用boolean并不能区分出具体是哪个子类。 判断空这方面,Dart有点激进,所有变量必须是非空的,除非用?问号修饰,表示变量可空。估计很难在Java上看到空安全了。

    作者回复: 空安全是一个热门的话题,我们后面也会讨论。

    2021-12-01
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部