《Java 高级编程》7.3 模式匹配的边界:守卫、null 与可读性
穷尽 switch 只解决了「分支是否齐全」,没有解决 null、守卫顺序和模式嵌套过深。本节用 LoanState 演示 case null 的三种写法、when 守卫的求值规则、模式支配的编译错误,并说明 JDK 25 中 primitive patterns 仍是预览特性,不能带进生产代码。
tag
穷尽 switch 只解决了「分支是否齐全」,没有解决 null、守卫顺序和模式嵌套过深。本节用 LoanState 演示 case null 的三种写法、when 守卫的求值规则、模式支配的编译错误,并说明 JDK 25 中 primitive patterns 仍是预览特性,不能带进生产代码。
ErrorCode 枚举加 default 分支的问题不是写法丑,而是新增错误码时编译器不会提醒任何消费方。本节用 LoanState 和 LoanResult 的 sealed 层次演示穷尽 switch,真实编译一次「新增子类型」的失败,并给出 libraryd 中罚金、下一步动作与 HTTP 映射的落地代码。
借阅结果从 service 传到 HTTP 层时,instanceof 加强制转换把类型判断和取值拆成两段。本节用 record pattern 把 LoanResult、LoanState 和嵌套 record 一次解构,讨论未命名模式、守卫与泛型擦除带来的边界,并给出可编译的 libraryd 展示层代码。
把 library 的 CLI 从字符串命令和 if/else 改成 sealed Command 接口加记录子类型,再用 switch 模式匹配一次性解构、守卫和分发;讲清 permits 的限制、穷尽性检查、模式顺序与 null 分支,并给出非穷尽 switch 与未授权实现的真实编译错误。
从 library 搜索参数的混合类型问题出发,讲清 instanceof 模式变量的流作用域、&& 右侧与提前返回后的作用范围,以及 switch 模式匹配里的 when 守卫和支配规则;最后用 parseValue 与 matches 把 year:2006、after:2006 这类过滤条件安全地落到 Book 字段上。