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

✔ 配置数据

✔ 不需要修改的数据结构


七、不适用场景 ❌

❌ 需要频繁修改字段

❌ 需要继承

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


相关推荐
程序员清风2 分钟前
从 JVM 内存模型到 GC 调优:Java 服务性能优化实战
java·jvm·性能优化
玖玥拾10 分钟前
Lua 基础语法(六)xLua Lua 调用 C# 交互
开发语言·unity·c#·lua
Joolun商城源码_Java13 分钟前
Java 商城技术栈怎么选:单体、微服务还是前后端分离多端?
java·开发语言·微服务
charlie11451419115 分钟前
浅谈C++的列表初始化std::initializer_list
开发语言·数据结构·c++·list·开源项目
拒绝内耗。18 分钟前
一个请求进入 Java 应用后,怎么找到我们写的方法?
java·开发语言
励志不掉头发的内向程序员22 分钟前
【LibreCAD 2D架构】RS_Line创建之后发生了什么?从图形容器到屏幕渲染
开发语言·c++·qt·学习·系统架构
夕除23 分钟前
redis--013
java·开发语言
object not found24 分钟前
Nuxt4去掉body中默认的边距
开发语言·后端·rust
码匠许师傅32 分钟前
【设计模式精讲】28.访问者模式(Visitor)
java·设计模式·访问者模式
Java后端的Ai之路33 分钟前
Git pull弹出vim编辑器完整排查指南
开发语言·人工智能·git·编辑器·vim