直接回答:三者合力把“代数数据类型”带进 Java:record 是透明的数据载体(一行声明换来构造器、equals/hashCode/toString,适合 DTO 与值对象);sealed class 限定继承的封闭集合(permits 列出全部子类);模式匹配(switch 的 pattern matching)对封闭类型做穷尽解构——编译器能检查你漏没漏分支。组合效果是:建模“要么是 A 要么是 B 要么是 C”的领域(表达式树、事件、状态)不再需要访问者模式的样板,漏处理新子类时编译直接报错。

展开解析:对比旧写法的信息量:一个求值器从“接口 + 五个实现类 + visitor 双重分发的几百行”变成“sealed interface + 五个 record + 一个 switch 表达式”的几十行,且新增子类时所有 switch 的穷尽性检查逼你处理每一处使用点——重构安全性质变。record 的注意点:紧凑构造器做校验(new 之前就能拒绝非法状态);组件是浅不可变(record 里的 List 字段自身可变,要防御性拷贝);序列化与框架兼容(Jackson、JPA 对新特性的支持版本要核对,JPA 实体不适合用 record,但 embeddable 和 DTO 投影很合适)。模式匹配的滚动演进:JDK 21 转正 switch 模式匹配与 record patterns(嵌套解构),后续还有未命名模式与原语类型匹配。实践建议:新代码的领域结果类型(成功/失败/各种失败原因)优先用这套组合,返回 Optional 加异常码的老风格可以退役了。

追问方向:sealed 与非密封接口的取舍?record 的序列化与 JSON 映射有哪些坑?

(约 480 字)