10分钟学会Java16新特性record
2026/6/8 11:58:31 网站建设 项目流程

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

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

1. record 是什么?

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

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

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

publicrecordPersonRecord(Stringname,intage){}

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


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

先看对比图:

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

publicclassPerson{privatefinalStringname;privatefinalintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}@Overridepublicbooleanequals(Objecto){// ... 省略若干行}@OverridepublicinthashCode(){// ... 省略若干行}@OverridepublicStringtoString(){return"Person{name='"+name+"', age="+age+"}";}}

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

publicrecordPersonRecord(Stringname,intage){}

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


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

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

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

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

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


4. 动手写第一个 record

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

完整示例代码如下:

publicrecordPersonRecord(Stringname,intage){}publicclassRecordDemo{publicstaticvoidmain(String[]args){// 创建实例PersonRecordperson=newPersonRecord("张三",25);// 读取字段(注意方法名没有 get 前缀)System.out.println(person.name());// 输出:张三System.out.println(person.age());// 输出:25// 自动生成的 toStringSystem.out.println(person);// 输出:PersonRecord[name=张三, age=25]// 两个字段相同,equals 返回 truePersonRecordanother=newPersonRecord("张三",25);System.out.println(person.equals(another));// 输出:true}}

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


5. 常见用法示例

5.1 作为方法返回值

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

publicrecordPoint(intx,inty){}publicclassGeometry{publicstaticPointgetOrigin(){returnnewPoint(0,0);}publicstaticvoidmain(String[]args){Pointorigin=getOrigin();System.out.println("x="+origin.x()+", y="+origin.y());}}

5.2 在集合中使用

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

importjava.util.HashSet;importjava.util.Set;publicrecordBookRecord(Stringisbn,Stringtitle){}publicclassBookDemo{publicstaticvoidmain(String[]args){Set<BookRecord>books=newHashSet<>();books.add(newBookRecord("978-001","Java 入门"));books.add(newBookRecord("978-001","Java 入门"));// 重复,不会添加System.out.println(books.size());// 输出:1}}

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

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

publicrecordStudentRecord(Stringname,intscore){// 自定义方法:判断是否及格publicbooleanisPassed(){returnscore>=60;}// 紧凑构造器:可以在创建时做简单校验publicStudentRecord{if(score<0||score>100){thrownewIllegalArgumentException("分数必须在 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。

7. 最后小结下哈

record是 Java 16 里非常实用的新特性。它的核心价值就一句话:

用更少的代码,表达"我就是一个数据对象"这件事。

当你遇到只有几个字段、主要用来传递或存储数据的场景,优先考虑 record。写起来快,读起来也清晰,还能减少因手写equals/hashCode出错带来的 bug。

花 10 分钟动手敲一遍上面的示例,下次写 Java 代码时,你就可以少写很多样板代码了。


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询