java 21起switch模式匹配成为正式特性,可安全简洁解析异构请求体,支持类型模式绑定、守卫条件、记录模式解构及null/unknown类型兜底处理。

Java 21 起,switch 的模式匹配(Pattern Matching for switch)已成为正式特性,能直接、安全、简洁地解析异构请求体(如 JSON 反序列化后的 Object 或泛型包装类型),无需 instanceof + 强转 + if 堆叠。关键在于用类型模式绑定变量,并结合守卫与记录模式处理嵌套结构。
识别并解包常见请求类型
假设后端接收统一入口的 Object 类型请求体(如 Spring 的 @RequestBody Object),它可能是 String、Integer、Map、List,甚至自定义 record:
- case String s && !s.isBlank() -> 处理非空字符串(如单值 ID 或命令码)
- case Integer i && i > 0 -> 接收正整数参数(如分页 size)
- case Map, ?> m && m.containsKey("user") && m.get("user") instanceof Map mapUser -> 先校验键存在,再对子结构做二次匹配
- case List> list && !list.isEmpty() -> 处理数组类请求(如批量操作 ID 列表)
用 record 模式解构结构化请求
若请求体已反序列化为 record(推荐用于 API 入参),可直接在 case 中解构字段:
- record SearchReq(String keyword, Integer page, Integer size) {}
- case SearchReq(String kw, Integer p, Integer s) && kw != null && p > 0 -> 执行搜索逻辑,kw、p、s 直接可用
- 支持嵌套:record User(String name, Address addr);record Address(String city, String zip);则 case User(String n, Address(String c, String z)) -> 可一次性提取四层字段
安全处理 null 和未知类型
null 不会匹配任何类型模式,必须显式覆盖:
- case null -> throw new IllegalArgumentException("请求体为空")
- default -> throw new IllegalArgumentException("不支持的请求类型: " + obj.getClass().getName())
- 避免漏掉 default:编译器不会强制要求,但生产环境必须兜底,否则遇到未预见类型会抛 MatchException
与 Jackson / Gson 配合的最佳实践
不要把原始 JSON 字符串直接丢进 switch —— 先轻量反序列化为 Object 或泛型容器,再匹配:
- 用 ObjectMapper.convertValue(jsonNode, Object.class) 得到运行时类型明确的对象
- 对复杂嵌套,优先定义 record 而非 Map
:record 提供编译期字段校验 + IDE 支持 + 不可变语义 - 若需兼容旧版 Map 风格,可用 case Map
req -> { String op = (String) req.get("op"); ... },但不如 record 安全











