news 2026/8/25 5:04:07

Java 21 switch 模式匹配实战:sealed 接口 + record 替代 if-instanceof 链

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 21 switch 模式匹配实战:sealed 接口 + record 替代 if-instanceof 链

Java 21 switch 模式匹配实战:sealed 接口 + record 替代 if-instanceof 链

处理一族类型时,你写过多少这样的代码?if (shape instanceof Circle c) { ... } else if (shape instanceof Rectangle r) { ... } else if ...。分支一多就成了又臭又长的判断链,新增类型时编译器还不提醒你哪里漏了处理。Java 21 把 switch 模式匹配(JEP 441)转正,配合 sealed 接口和 record,能把这类代码写得又短又安全,漏一个分支直接编译报错。这篇用一个几何图形的例子讲透。

老写法:instanceof 链的三个痛点

先看没有模式匹配时的典型写法:

interfaceShape{}recordCircle(doubleradius)implementsShape{}recordRectangle(doublew,doubleh)implementsShape{}recordTriangle(doublebase,doubleheight)implementsShape{}doublearea(Shapeshape){if(shapeinstanceofCircle){Circlec=(Circle)shape;// 还得手动强转returnMath.PI*c.radius()*c.radius();}elseif(shapeinstanceofRectangle){Rectangler=(Rectangle)shape;returnr.w()*r.h();}elseif(shapeinstanceofTriangle){Trianglet=(Triangle)shape;return0.5*t.base()*t.height();}thrownewIllegalArgumentException("未知图形: "+shape);}

痛点有三:每个分支都要手动强制转型;分支之间没有约束,漏写一个类型编译器一声不吭,只能运行时抛异常;代码噪音大,真正的业务(算面积)被样板代码淹没。

第一步:用 sealed 封死类型集合

sealed关键字(Java 17 转正)让你显式声明「哪些类型可以实现这个接口」。这一步是模式匹配能做穷尽性检查的前提:

sealedinterfaceShapepermitsCircle,Rectangle,Triangle{}recordCircle(doubleradius)implementsShape{}recordRectangle(doublew,doubleh)implementsShape{}recordTriangle(doublebase,doubleheight)implementsShape{}

permits列出的三个就是Shape全部实现,编译器由此知道这是一个封闭集合。record 则自动生成构造器、radius()这类访问器和equals,做数据载体正合适。

第二步:switch 模式匹配,强转全省了

有了 sealed,switch 就能直接对类型分支,并自动把匹配到的对象绑定到一个变量,不用再强转:

doublearea(Shapeshape){returnswitch(shape){caseCirclec->Math.PI*c.radius()*c.radius();caseRectangler->r.w()*r.h();caseTrianglet->0.5*t.base()*t.height();};}

注意这里没有 default 分支,却能编译通过。因为Shape是 sealed 的,编译器确认三个 case 已经覆盖了所有可能的类型——这就是穷尽性(exhaustiveness)。它的价值在下一节。

sealed + switch 的杀手锏:漏分支编译不过

假设某天团队新增了一种图形:

sealedinterfaceShapepermitsCircle,Rectangle,Triangle,Square{}recordSquare(doubleside)implementsShape{}

只要你没在area的 switch 里补上case Square,编译立刻失败:

error: the switch statement does not cover all possible input values

这就是它比 instanceof 链强的核心:新增类型时,编译器会揪出每一处需要更新的 switch,而不是等到线上跑出IllegalArgumentException才发现。类型安全从运行时提前到了编译期。

record 解构:直接把字段拆出来

Java 21 的模式匹配还支持 record 解构(record patterns),可以在 case 里直接把 record 的字段绑定成变量,连访问器都省了:

doublearea(Shapeshape){returnswitch(shape){caseCircle(doubler)->Math.PI*r*r;caseRectangle(doublew,doubleh)->w*h;caseTriangle(doubleb,doubleh)->0.5*b*h;caseSquare(doubles)->s*s;};}

when 守卫:同一类型再按条件细分

有时同一类型要根据取值走不同逻辑,用when加一个布尔守卫即可,比嵌套 if 清爽得多:

Stringdescribe(Shapeshape){returnswitch(shape){caseCirclec when c.radius()>100->"超大圆";caseCirclec->"普通圆";caseRectangle(doublew,doubleh)when w==h->"正方形(其实是矩形)";caseRectangler->"矩形";default->"其他图形";};}

注意顺序:带 when 的分支要放在同类型的无条件分支前面,否则无条件分支会先兜住,守卫永远命中不了——编译器也会对这种「被遮蔽」的 case 报错,算是又帮你兜了一层。

别忘了处理 null

传统 switch 遇到 null 会直接抛NullPointerException。Java 21 允许显式写case null,把空值也纳入统一处理,不用在 switch 外面再包一层判空:

StringsafeDescribe(Shapeshape){returnswitch(shape){casenull->"空图形";caseCirclec->"圆";default->"其他";};}

小结

  • sealed接口封死类型集合,是 switch 做穷尽性检查的前提;record 做不可变数据载体。
  • Java 21 的 switch 模式匹配自动完成类型匹配与变量绑定,彻底告别手动强转和 instanceof 链。
  • 最大价值是编译期穷尽性:sealed 类型下漏写分支直接编译失败,新增类型时编译器帮你定位所有要改的地方。
  • record 解构直接拆字段,when守卫按条件细分,case null统一处理空值。

一句话记忆:sealed 定义「就这几种类型」,switch 模式匹配保证「每种都处理到」——漏一个,编译器不放你过。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 5:02:06

构建万级QPS多模态AI审核系统:架构设计与工程实践

1. 从“人眼审核”到“AI流水线”:为什么我们需要万级QPS的审核系统?几年前,我还在一个内容平台负责审核团队的技术支持。那时候,最让人头疼的就是深夜的流量高峰。一个热点事件爆发,用户上传的视频量瞬间激增&#xf…

作者头像 李华
网站建设 2026/8/25 5:00:27

机器人舞蹈背后的技术:从仿真到运动控制实践指南

这次我们来看一个在机器人领域引发广泛关注的事件:优必选机器人在世界机器人大会上的现场舞蹈表演。这不仅仅是简单的动作展示,而是集成了运动控制、实时规划、多机协同与动态平衡等多项前沿技术的综合体现。对于开发者、机器人爱好者以及关注具身智能落…

作者头像 李华
网站建设 2026/8/25 4:58:08

五大主流简历模板平台横向测评与选型指南

1. 简历模板平台测评背景与需求分析在当今竞争激烈的求职环境中,一份专业得体的简历往往能成为获得面试机会的关键敲门砖。根据2023年LinkedIn调研数据显示,HR平均仅用6-7秒就能完成一份简历的初步筛选,这意味着简历的版式设计、信息组织方式…

作者头像 李华
网站建设 2026/8/25 4:57:42

LeetCode刷题指南:提升算法能力与面试准备

1. LeetCode 是什么?LeetCode 是一个面向程序员的技术学习和面试准备平台,主要提供算法和数据结构相关的编程题目。它最初成立于2015年,现已成为全球程序员准备技术面试的首选平台之一。平台上的题目大多来自知名科技公司的真实面试题&#x…

作者头像 李华
网站建设 2026/8/25 4:57:37

Windows Docker开发环境搭建:WSL配置、软件安装与防火墙设置详解

上周帮一个刚接触 Docker 的朋友配置 Windows 开发环境,他上来就问我:“为什么我照着教程装了 Docker Desktop,但一启动就报错,说虚拟化没开?我明明在 BIOS 里打开了啊。” 我让他把 WSL 的版本和状态发给我看&#xf…

作者头像 李华
网站建设 2026/8/25 4:57:07

OmniRoute+VS Code:免费搭建无限AI编程助手,替代Claude Code

最近在尝试将AI编程助手深度集成到开发工作流中,发现很多优秀的工具要么收费高昂,要么对地区有所限制,比如Claude Code。这让我开始寻找一个稳定、免费且功能强大的替代方案。经过一番探索和实测,我找到了一套近乎完美的组合&…

作者头像 李华