Java Record 类 — 简化不可变对象的写法

从 JDK 14 开始,Java 引入了 record 类型,用于简化 不可变数据对象(Immutable Data Object) 的书写。它类似于 Lombok 的 @Data,但语义更明确:用于存放数据且不可修改。


1. 基本语法

java 复制代码
package Works;

public record Student(String name, int age) {
}
  • record 会自动生成:

    • 构造方法
    • equals()
    • hashCode()
    • toString()
    • 所有字段的 getter 方法(字段名本身就是方法名)
  • 不会生成 setter 方法,因为 record 是不可变的。


2. 使用示例

java 复制代码
package Works;

public class Main {
    public static void main(String[] args) {
        Student s = new Student("Warren", 18);

        // record 自动生成 getter 方法
        System.out.println(s.name()); // 输出: Warren
        System.out.println(s.age());  // 输出: 18

        // s.age = 20; // ❌ 编译错误,不能修改属性值
    }
}

3. record 的不可变性

  • record 的字段都是 final 修饰的,表示引用不可变。
  • 注意:不可变是浅层的,引用对象的内部内容仍然可以修改。例如:
java 复制代码
public record Classroom(String name, int[] scores) {}

public class Main {
    public static void main(String[] args) {
        int[] arr = {90, 95, 100};
        Classroom c = new Classroom("Class A", arr);

        // 修改数组内容
        c.scores()[0] = 50;
        System.out.println(Arrays.toString(c.scores())); // [50, 95, 100]
    }
}

⚠ record 保证引用不可变,但不能保证引用对象本身不可变。如果需要深度不可变,需要自己做防御性拷贝(deep copy)。


4. record 的特点总结

特性 说明
自动生成构造方法 简化代码,无需手写
自动生成 equals()、hashCode()、toString() 可直接用于比较、打印
只生成 getter 没有 setter,属性不可直接修改
final 字段 引用不可变,但引用对象内容可能可变
用途 存放不可变数据、DTO、返回值对象等

5. record vs 普通类 + Lombok

  • 普通类 + Lombok 可以生成 getter/setter,但语义不明确,需要手动控制不可变性。
  • record 自带不可变语义,更安全,更适合 只存储数据、没有业务逻辑的对象。

相关推荐
vipxieliang2 分钟前
ValidX vs 正则表达式:可读性与维护性对比
java·spring boot
thusloop4 分钟前
零门槛接入 GPT-6-astra 与 claude-opus-5-5,三大场景实战指南
python·gpt·算法·agent·claude·codex
337808 分钟前
5分钟搞懂登录认证和授权框架Spring Security
java·spring boot
vipxieliang9 分钟前
Spring Security 6.x 实战:认证、授权与 JWT 集成
java·spring boot
world781122612 分钟前
【C++】set 和 map
java·前端·c++·set·map
学长毕设12 分钟前
基于SpringBoot的社区体育馆预约系统的设计与实现
java·spring boot·后端
程序猿乐锅15 分钟前
Streamlit 实现 AI 聊天 Agent:角色提示词、流式输出与会话管理
开发语言·前端·笔记·后端·python·学习
小南知更鸟19 分钟前
【2026 年 Python 包管理工具选型:从“工具崇拜”回到工程约束】
开发语言·python
瓦瓦gogo19 分钟前
学回溯算法时,我先弄明白了怎么“退回来”
算法
m0_6399069434 分钟前
MySQL 实现分布式锁:悲观锁、乐观锁、唯一索引锁
数据库·分布式·mysql