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

✔ 配置数据

✔ 不需要修改的数据结构


七、不适用场景 ❌

❌ 需要频繁修改字段

❌ 需要继承

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


相关推荐
一条小小yu几秒前
为什么使用springboot
java·spring boot·后端
Elastic 中国社区官方博客8 分钟前
Kubernetes attributes processor v1:它对 EDOT Collector 意味着什么
java·大数据·elasticsearch·搜索引擎·贪心算法·kubernetes·全文检索
Sarvartha13 分钟前
对象创建与引用
java·开发语言
hasty38 分钟前
限制写了却没生效:OpenTelemetry Go 的 Unicode 截断边界
开发语言·后端·golang
大侠归来1 小时前
C语言与C++在基础语法上的区别
java·c语言·c++
小宋10211 小时前
SQL + RAG 混合问答实战:结构化指标与文档证据如何统一路由
java·jvm·人工智能·sql
bro_Java6661 小时前
链表进阶2:双向链表的构建
java·数据结构·链表
DianSan_ERP2 小时前
多平台订单自动下载与回传的技术实现:从消息推送到状态闭环引言
java·linux·服务器·前端·网络·架构·自动化
Joe_Wang52 小时前
【从0到1学习JVM · 13】点进JDK源码只有一个分号?搞懂本地方法栈与JNI机制
java·jvm·学习·本地方法栈
编码者卢布2 小时前
【App Service 】WebJobs 多实例实验:谁在运行,什么时候运行?
开发语言·python