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 自带不可变语义,更安全,更适合 只存储数据、没有业务逻辑的对象

相关推荐
总有刁民想爱朕ha5 小时前
Python PyQt5图片批量转MP4视频工具:本地离线免费无水印,完整代码
开发语言·python·qt
宸津-代码粉碎机5 小时前
FastUtil+AI多Agent实战:Java AI项目性能终极加速方案
java·服务器·开发语言·python·安全·php
_Narcissus_5 小时前
二分算法笔记及例题
数据结构·c++·笔记·算法·蓝桥杯·查找·二分算法
tachibana25 小时前
RAGAS 指标解读
数据库·人工智能·算法·机器学习·架构·大模型·llm
choumou_M5 小时前
SpringBoot_5:商品秒杀场景的并发实践(初步)
java·spring boot·后端
Python私教6 小时前
Python 3.15 来了:free-threading 稳定 ABI 能给高并发服务带来什么
开发语言·python
suaizai_6 小时前
AI Agent如何懂你:四层能力拆解
java·前端·人工智能
javachen__6 小时前
Docker一键清理 + 全局限制,告别日志报满
java·docker·容器
qq_419563096 小时前
ToT 的 BFS/DFS 有个致命缺口:蒙特卡洛树搜索(MCTS)用「随机试错+统计」让大模型想得更深,小模型 + 它竟超过 GPT-4
算法·深度优先·宽度优先
早安试言6 小时前
maven安装
java·maven