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返回数据

✔ 配置数据

✔ 不需要修改的数据结构


七、不适用场景 ❌

❌ 需要频繁修改字段

❌ 需要继承

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


相关推荐
三翼鸟数字化技术团队13 分钟前
高性能存储引擎RocksDB:原理与Java生态实践
java
SL_staff27 分钟前
JVS-APS有限产能建模的七个刚性支点:面向产线真实约束的技术实现解析
java·开源·全栈
特立独行的猫A28 分钟前
少 3 个环节、少 1 次 ABI、少 3500 行代码:cj-tauri 与 Ionic/Capacitor 的鸿蒙桥接机制对比
java·后端·python
学长毕设44 分钟前
基于SpringBoot的高校后勤报修管理系统-附源码
java·spring boot·后端
特立独行的猫A1 小时前
cj-tauri vs Rust/Tauri 同款播放器实测:编译 21 秒 vs 11 分钟,磁盘 12 MB vs 1.2 GB
java·后端·python
杨凯凡1 小时前
Spring AI RAG 实战:向量检索、租户过滤、引用溯源与防幻觉边界
java·人工智能·spring
Felven2 小时前
C. Brr Brrr Patapim
c语言·开发语言
小科先生2 小时前
Java springboot调用数据库的基本流程
java·数据库·spring boot
秋饼3 小时前
GPT-Live 全双工语音 API Java 服务端落地实战:事件协议、会话恢复与生产踩坑
java·ai·技术分享·后端开发
SL_staff3 小时前
为什么企业级自动化不能只靠AI编排?——逻辑引擎在确定性业务场景中的不可替代性
java·开源·产品