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

✔ 配置数据

✔ 不需要修改的数据结构


七、不适用场景 ❌

❌ 需要频繁修改字段

❌ 需要继承

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


相关推荐
sjmaysee2 小时前
mysql之联合索引
java
枫叶丹42 小时前
【HarmonyOS 6.0】窗口能力增强:PC/2in1与自由多窗模式的深度解析
开发语言·华为·harmonyos
AI科技星2 小时前
基于三维空间合速度恒为光速公理的统一动力学与热力学理论:温度本质的第一性原理诠释与物质全物态实验验证
开发语言·线性代数·机器学习·计算机视觉·数学建模
Dovis(誓平步青云)2 小时前
《QT学习第二篇:QT的常用控件属性与按钮、view系列、Label、输入框》
开发语言·qt·学习
胖咕噜的稞达鸭2 小时前
C/C++动态内存管理,malloc,calloc,realloc的区别,动态内存中的错误汇总
c语言·开发语言·c++
charlie1145141912 小时前
嵌入式C++教程实战之Linux下的单片机编程(6):从点亮第一盏LED开始 —— 我们为什么要用现代C++写STM32
linux·c语言·开发语言·c++·stm32·单片机
沐知全栈开发2 小时前
Ruby 哈希(Hash)
开发语言
HoneyMoose2 小时前
Markdown 为什么会被更广泛的使用
java
徒 花2 小时前
Python知识学习03
开发语言·python·学习