WMX · 随记
·Java· 3 分钟阅读

record 的紧凑构造器:在创建时建立约束

一个只保存数据的对象,也可能有“数量必须大于零”这样的不变量。若每个调用方都自己验证,规则很容易出现分歧。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Full Course

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

一个只保存数据的对象,也可能有“数量必须大于零”这样的不变量。若每个调用方都自己验证,规则很容易出现分歧。

理解核心机制

record 可以在紧凑构造器中检查参数或做防御性复制。参数在构造器主体结束后写入对应字段。record 自动提供值相关方法,但不会自动理解业务规则。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java14 行 · 可横向滚动
public class Demo {
    record OrderLine(String product, int quantity) {
        OrderLine {
            if (product == null || product.isBlank())
                throw new IllegalArgumentException("product required");
            if (quantity <= 0)
                throw new IllegalArgumentException("positive quantity required");
            product = product.strip();
        }
    }
    public static void main(String[] args) {
        System.out.println(new OrderLine(" book ", 2));
    }
}

适用边界与常见误区

record 只提供浅层的字段不可重新绑定,不会冻结嵌套可变对象。反序列化和框架绑定也需要确认实际使用的构造路径。

继续练习

添加一个 List<String> 分量并使用 List.copyOf;再试着修改传入列表,确认记录对象是否符合预期。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档