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 wh-正方形(其实是矩形);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 模式匹配保证「每种都处理到」——漏一个,编译器不放你过。

相关新闻

免费的大模型Agnes-2.0-Flash升级到Agnes-2.5-Flash

免费的大模型Agnes-2.0-Flash升级到Agnes-2.5-Flash

Agnes-2.5-Flash vs Agnes-2.0-Flash:模型对比与接入指南依据 Agnes AI 官方文档整理 | https://agnes-ai.com/zh-Hans/docs/真伪✅ 真——基于 Agnes AI 官网公开文档核验(agnes-ai.com/zh-Hans/docs/)时间截至 2026-07-27 访问时核验对象开…

2026/8/26 7:07:26 阅读更多 →
MyBatis‑Generator 逆向工程(SSM Maven 聚合项目)

MyBatis‑Generator 逆向工程(SSM Maven 聚合项目)

一、项目模块结构说明采用 Maven 聚合架构: 父工程:统一管理版本号,聚合所有子模块。 core 核心模块:model、dao、service、mapper 映射文件、工具类,逆向工程写在此模块。 web 模块(前台 / 后台&#xff0…

2026/8/25 5:04:24 阅读更多 →
hive数组巨详细解析

hive数组巨详细解析

一、Hive 数组是什么? Hive 的数组(ARRAY)用于在一个字段中保存多个同类型元素,类似 Java 的 List 或 Python 的 list。 例如: user_id | tags --------|---------------------- 1 | ["java", "h…

2026/8/26 7:07:32 阅读更多 →

最新新闻

特征值与特征向量:从几何直观到PCA降维与矩阵对角化实战

特征值与特征向量:从几何直观到PCA降维与矩阵对角化实战

1. 项目概述:为什么特征值与特征向量是线性代数的“灵魂”如果你学线性代数,学到矩阵乘法、行列式、秩这些概念,感觉还像是在处理一堆数字的排列组合,那么从特征值和特征向量开始,这门课的味道就彻底变了。我第一次真正…

2026/8/26 7:07:16 阅读更多 →
基于YOLOv8的车道抛洒物检测:从数据标注到边缘部署实战解析

基于YOLOv8的车道抛洒物检测:从数据标注到边缘部署实战解析

简介:目标检测作为计算机视觉的核心任务,在智慧交通、自动驾驶和道路安全监控等领域有着广泛应用。实际场景中,目标尺度小、背景复杂、光照变化剧烈,传统检测算法难以兼顾精度与实时性。YOLOv8作为高效的一阶段检测器,…

2026/8/26 7:07:16 阅读更多 →
用PIC32打造纯MCU迷你街机:从硬件到游戏开发的完整实践

用PIC32打造纯MCU迷你街机:从硬件到游戏开发的完整实践

最近把吃灰半年的一块PIC32开发板翻出来,做了一个能玩俄罗斯方块、贪吃蛇和打砖块的小型街机。先说明一下,不是那种跑Linux的高大上模拟器方案,而是纯MCU实现的“硬核”迷你街机。整个项目从选型、画板到写游戏逻辑,折腾了大概三周…

2026/8/26 7:07:16 阅读更多 →
基于树莓派的救援机器人实战:从硬件选型到代码实现

基于树莓派的救援机器人实战:从硬件选型到代码实现

做救援机器人这件事,我折腾了差不多大半年,从最开始用Arduino加几个超声波模块的小玩具,到最后用树莓派(Raspberry Pi)做主控、带着摄像头和一堆传感器能在废墟模拟场里穿行的完整原型机,中间踩过的坑真不少…

2026/8/26 7:07:16 阅读更多 →
Claude Code权限模式详解:从文件编辑到终端命令的精细化AI协作管控

Claude Code权限模式详解:从文件编辑到终端命令的精细化AI协作管控

1. 从“助手”到“协作者”:Claude Code权限模式的核心价值如果你和我一样,长期在VSCode里和各种AI编程助手打交道,从早期的GitHub Copilot到后来的Cursor,再到如今风头正劲的Claude Code,一个最直观的感受是&#xff…

2026/8/26 7:07:16 阅读更多 →
基于YOLOv5的手部X光骨骼检测:从数据工程到模型部署实战

基于YOLOv5的手部X光骨骼检测:从数据工程到模型部署实战

1. 项目缘起:从一张X光片说起作为一名长期混迹于计算机视觉和医疗影像交叉领域的技术人,我经常被问到:“你们搞AI的,到底能不能帮医生看片子?” 这个问题背后,是临床医生每天面对海量影像数据时&#xff0c…

2026/8/26 7:06:16 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →