10分钟学会Java16新特性record

大家好,我是Java1234_小锋老师。

10分钟学会Java16新特性record

Java 16 正式发布于 2021 年,其中 record 是一个让人眼前一亮的特性。如果你写过"只有几个字段、用来装数据"的类,这篇文章就是为你准备的。

1. record 是什么?

简单说,record 就是 Java 专门用来表示不可变数据的一种写法。

比如用户信息、坐标点、订单摘要------这些对象通常只有几个字段,主要用来"存数据、读数据",不需要复杂的业务逻辑。以前你得写一个 class,再手写构造方法、getter、equalshashCodetoString......代码一多,看着就烦。

从 Java 16 开始,你可以直接用 record 一行搞定:

arduino 复制代码
public record PersonRecord(String name, int age) {}

就这一行,编译器会自动帮你补全大部分样板代码。是不是清爽很多?


2. 和传统 class 比,省了什么?

先看对比图:

以前写一个"人员信息"类,大概长这样:

typescript 复制代码
public class Person {
    private final String name;
    private final int age;
​
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public int getAge() {
        return age;
    }
​
    @Override
    public boolean equals(Object o) {
        // ... 省略若干行
    }
​
    @Override
    public int hashCode() {
        // ... 省略若干行
    }
​
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

同样的功能,用 record 只需要:

arduino 复制代码
public record PersonRecord(String name, int age) {}

几十行代码,压缩成一行。这不是炫技,而是 Java 官方在帮你减少重复劳动。


3. record 会自动帮你生成什么?

下面这张图帮你快速理解 record 的内部结构:

当你声明一个 record 时,编译器会自动生成:

自动生成内容 说明
构造方法 参数和字段一一对应
访问方法 name()age(),注意不是 getName()
equals() / hashCode() 按字段值比较
toString() 打印所有字段,方便调试

另外,record 的字段默认是 private final 的,创建后不能修改,天然适合"只读数据"场景。


4. 动手写第一个 record

使用流程可以概括为三步:

完整示例代码如下:

csharp 复制代码
public record PersonRecord(String name, int age) {
}
​
public class RecordDemo {
    public static void main(String[] args) {
        // 创建实例
        PersonRecord person = new PersonRecord("张三", 25);
​
        // 读取字段(注意方法名没有 get 前缀)
        System.out.println(person.name());  // 输出:张三
        System.out.println(person.age());   // 输出:25
​
        // 自动生成的 toString
        System.out.println(person);         // 输出:PersonRecord[name=张三, age=25]
​
        // 两个字段相同,equals 返回 true
        PersonRecord another = new PersonRecord("张三", 25);
        System.out.println(person.equals(another));  // 输出:true
    }
}

运行这段代码,你就能直观感受到 record 的便利:写得更少,功能却一点不少。


5. 常见用法示例

5.1 作为方法返回值

方法返回多个值时,record 特别合适:

csharp 复制代码
public record Point(int x, int y) {}
​
public class Geometry {
    public static Point getOrigin() {
        return new Point(0, 0);
    }
​
    public static void main(String[] args) {
        Point origin = getOrigin();
        System.out.println("x=" + origin.x() + ", y=" + origin.y());
    }
}

5.2 在集合中使用

record 自动实现了 equalshashCode,可以直接放进 Set 或作为 Map 的 key:

java 复制代码
import java.util.HashSet;
import java.util.Set;
​
public record BookRecord(String isbn, String title) {}
​
public class BookDemo {
    public static void main(String[] args) {
        Set<BookRecord> books = new HashSet<>();
        books.add(new BookRecord("978-001", "Java 入门"));
        books.add(new BookRecord("978-001", "Java 入门")); // 重复,不会添加
​
        System.out.println(books.size()); // 输出:1
    }
}

5.3 添加自定义方法(可选)

record 也可以写自己的方法,但不能添加新的实例字段

arduino 复制代码
public record StudentRecord(String name, int score) {
​
    // 自定义方法:判断是否及格
    public boolean isPassed() {
        return score >= 60;
    }
​
    // 紧凑构造器:可以在创建时做简单校验
    public StudentRecord {
        if (score < 0 || score > 100) {
            throw new IllegalArgumentException("分数必须在 0~100 之间");
        }
    }
}

6. 使用 record 时要注意什么?

几点实用建议,帮你少走弯路:

  1. 适合存数据,不适合复杂业务 record 的设计目标是"数据载体",如果类里要维护大量可变状态或复杂继承关系,还是用普通 class 更合适。
  2. 字段访问方法没有 get 前缀 调用 person.name() 而不是 person.getName(),刚开始可能会不习惯。
  3. 字段不可变 创建后不能修改字段值。如果需要"改数据",只能 new 一个新 record。
  4. 不能继承其他类 record 隐式继承 java.lang.Record,且不能再继承别的类(但可以实现接口)。
  5. Java 版本要求 record 在 Java 14、15 作为预览特性出现,Java 16 起正式可用。使用前确认你的 JDK 版本 ≥ 16。
相关推荐
程序员皮皮林1 小时前
Dubbo 的 SPI 和 JDK 的 SPI 有什么区别?
java·开发语言·dubbo
是多巴胺不是尼古丁1 小时前
java‘期末复习--多态
java·开发语言
瑞雪兆丰年兮1 小时前
[从0开始学Java|第二十五天]项目阶段(综合练习&斗地主小游戏)
java·windows
Demon1_Coder1 小时前
Day4-微服务-Seata默认事务
java·数据库·微服务
Sunia1 小时前
《AgentX 专栏》08-工作流引擎:AgentWorkflow怎么把工具记忆流程串成一条流水线
java·架构
huipeng9261 小时前
企业级微服务开发实战(二):微服务基础设施搭建与中间件部署
java·redis·mysql·spring cloud·微服务·nacos·rabbitmq
Jabes.yang1 小时前
Java电商订单系统面试全流程解析:接口设计、数据库、微服务与分布式事务实战
java·微服务·mybatis·分布式事务·电商·订单系统·接口设计
码语智行1 小时前
导入模板下载
java
摇滚侠2 小时前
IDEA 创建 Java 项目 推送到远程 Git 仓库
java·git·intellij-idea