record只读类

一、什么是 record

record 是从 Java 14(正式在 Java 16)引入的一种特殊类,用来快速定义"只读数据类"。

👉 本质一句话:
record = 自动生成的不可变(只读)数据类


二、最简单的例子 🌰

java 复制代码
public record User(String name, int age) {}

这一行代码,其实帮你自动生成了👇:

java 复制代码
final class User {  
    private final String name;  
    private final int age;  
  
    public User(String name, int age) {  
        this.name = name;  
        this.age = age;  
    }  
  
    public String name() { return name; }  
    public int age() { return age; }  
  
    // 自动生成  
    public boolean equals(Object o) { ... }  
    public int hashCode() { ... }  
    public String toString() { ... }  
}

三、为什么说它是"只读类"?🔒

1️⃣ 所有属性都是 final

java 复制代码
private final String name;

👉 一旦赋值,不能修改


2️⃣ 没有 setter 方法

java 复制代码
user.setName("Tom"); // ❌ 不存在

👉 只能读,不能改


3️⃣ 类本身是隐式 final

java 复制代码
public record User(...) {}

👉 不能被继承


4️⃣ 数据不可变(核心思想🔥)

java 复制代码
User u = new User("Alice", 20);  
// u.name = "Bob"; ❌ 不允许

👉 想改?只能 new 一个新的对象


四、常用特性

1️⃣ 自动生成方法(非常香✨)

  • 构造方法
  • getter(注意:不是 getName(),而是 name())
  • equals()
  • hashCode()
  • toString()

2️⃣ 可以自定义构造方法

java 复制代码
public record User(String name, int age) {  
    public User {  
        if (age < 0) {  
            throw new IllegalArgumentException("年龄不能为负数");  
        }  
    }  
}

👉 这叫"紧凑构造器"


3️⃣ 可以加方法(但不能改字段)

java 复制代码
public String info() {  
    return name + "-" + age;  
}

五、record vs 普通类 ⚔️

对比项 record 普通类
是否可变 ❌ 不可变 ✅ 可变
setter ❌ 没有 ✅ 有
getter 自动生成 手写
equals/hashCode 自动 手写
代码量 极少 较多
继承 ❌ 不可继承 ✅ 可以

六、适用场景 🎯

record 特别适合:

✔ DTO(数据传输对象)

✔ VO(返回对象)

✔ API返回数据

✔ 配置数据

✔ 不需要修改的数据结构


七、不适用场景 ❌

❌ 需要频繁修改字段

❌ 需要继承

❌ 复杂业务对象(有很多行为)


相关推荐
雨落在了我的手上21 小时前
Java数据结构(九):栈和队列
java·开发语言·数据结构
j7~21 小时前
【C语言】《C语言自定义类型(结构体+联合体+枚举类型)》--详解
c语言·开发语言·深度学习·结构体·位段·联合体·枚举类型
Escalating_xu21 小时前
C++11 彻底吃透 emplace_back 与 push_back(最全闭环:左右值|深浅拷贝|移动构造|万能引用|完美转发)
开发语言·c++
春生野草21 小时前
个人笔记--大顶堆和基数排序
java·数据结构·算法
高铭杰21 小时前
Golang sync.Mutex实现原理学习
java·学习·golang
皓月斯语1 天前
B3865 [GESP202309 二级] 小杨的 X 字矩阵 题解
开发语言·c++·矩阵·题解
Highcharts.js1 天前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
头发还在的女程序员1 天前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats1 天前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123451 天前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime