网易首页 > 网易号 > 正文 申请入驻

Java record 用了半年,POJO 的样板代码砍掉一半

0
分享至

写 Java 的都懂那种痛:定义一个简单的数据载体类——就装几个字段——结果要写一大坨样板。私有字段、全套 getter、构造方法、equals、hashCode、toString,一个只有三个字段的类能撑到七八十行。IDE 是能帮你生成,但生成完那一屏代码看着就累,字段一改还得重新生成。

Java 16 正式带来的 record 把这事彻底解决了。用了半年,我们项目里的 DTO、VO 这些纯数据类基本全换成了 record,样板代码砍掉一大半。今天讲讲它好在哪、什么时候该用什么时候别用。



传统 POJO 有多啰嗦

先看一个传统的不可变数据类要写多少东西。一个表示「点」的类,就 x、y 两个字段:

public final class Point {

private final int x;

private final int y;

public Point(int x, int y) { // 构造方法

this.x = x;

this.y = y;

public int getX() { return x; } // getter

public int getY() { return y; }

@Override

public boolean equals(Object o) { // equals

if (this == o) return true;

if (!(o instanceof Point)) return false;

Point point = (Point) o;

return x == point.x && y == point.y;

@Override

public int hashCode() { // hashCode

return Objects.hash(x, y);

@Override

public String toString() { // toString

return "Point{x=" + x + ", y=" + y + "}";

三十多行,真正的信息量就是「x 和 y 两个 int」,剩下全是机械样板。而且这些样板还有隐患:你给类加了个字段 z,得记着同步改构造方法、加 getter、改 equals、改 hashCode、改 toString,漏改一个就埋下 bug——比如 equals 忘了带上 z,两个 z 不同的对象会被判相等。

record:一行顶三十行

同样的类,用 record 写:

public record Point(int x, int y) {}

就这一行。record 关键字后面括号里声明的叫「组件」(components),你把字段往那一放,编译器自动给你生成:

  • 一个全字段的构造方法
  • 每个字段的访问方法(注意:是 x() 不是 getX(),record 用的是字段同名方法)
  • equals 和 hashCode(自动基于所有字段)
  • toString(自动列出所有字段)

而且字段自动是 private final 的,record 本身不可变。用起来:

Point p = new Point(1, 2);

System.out.println(p.x()); // 1 —— 访问方法是 x(),不是 getX()

System.out.println(p); // Point[x=1, y=2] —— 自动 toString

System.out.println(p.equals(new Point(1, 2))); // true —— 自动 equals

最爽的是「加字段」这件事:你想加个 z,就把 record 改成 record Point(int x, int y, int z) {},构造方法、访问方法、equals、hashCode、toString 全自动跟着更新,绝无遗漏。再也不会出现「equals 忘了带新字段」那种隐蔽 bug。

record 能做的不止这些

别以为 record 只能当个空壳数据袋,它还能加东西,只是有边界。

可以加方法。record 里能定义普通方法、静态方法、静态字段:

public record Point(int x, int y) {

// 加个实例方法

public double distanceTo(Point other) {

int dx = x - other.x(), dy = y - other.y();

return Math.sqrt(dx * dx + dy * dy);

// 加个静态工厂方法

public static Point origin() {

return new Point(0, 0);

可以校验参数。用「紧凑构造方法」(compact constructor)能在构造时做校验,不用写完整的构造方法签名:

public record Range(int start, int end) {

public Range { // 紧凑构造方法,没有参数列表

if (start > end) {

throw new IllegalArgumentException("start 不能大于 end");

// 不用写 this.start = start,编译器自动补上赋值

那个 public Range { ... } 没有参数列表,是 record 特有的紧凑写法。你在里面写校验逻辑,赋值语句编译器帮你补。这是给数据加约束的标准姿势。

什么时候别用 record

record 虽好,但它有明确的适用边界,不是所有类都该换。它的设计定位就是「不可变的数据载体」,以下情况别用:

情况

为什么不适合 record

需要可变状态

record 字段全是 final,天生不可变,要改字段就别用

需要继承别的类

record 已经隐式继承了 Record,不能再 extends 别的类

是个有行为的领域对象

record 适合"装数据",重逻辑的业务实体用普通类更合适

JPA 实体

JPA 一般要求无参构造和可变字段,record 不满足

简单说,record 是给 DTO、VO、配置项、多返回值打包、值对象这类「纯数据、不可变」的场景用的。如果一个类有复杂的可变状态、有大量业务行为、需要继承体系,那它不是数据载体,老老实实用普通类。

实际项目里,我们的判断很简单:这个类是不是「就为了把几个值打包传来传去、且不需要中途修改」?是,就 record;不是,就普通类。接口的请求响应 DTO、查询返回的 VO、方法要返回多个值时的打包,这些全换成了 record,代码瞬间清爽。

半年用下来,record 给我最大的价值不只是「少写代码」,更是「少出错」——那些靠手动维护 equals/hashCode 一致性的隐患,全没了,编译器替你保证。如果你的项目还在 Java 16+ 上手写一堆 POJO 样板,真该试试 record,把省下来的精力放到真正重要的业务逻辑上。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
刑侦大案口述纪实:尘封28年,南医大女学生命案终告侦破!

刑侦大案口述纪实:尘封28年,南医大女学生命案终告侦破!

橘仔看世界
2026-06-23 09:09:12
被中国限制入境港澳后,美国宣布退出,不派官员参加澳门会议!

被中国限制入境港澳后,美国宣布退出,不派官员参加澳门会议!

王姐懒人家常菜
2026-06-26 14:38:43
前女篮队长陈鹭芸患癌离世,临终念父,年仅38岁,阿联哀悼

前女篮队长陈鹭芸患癌离世,临终念父,年仅38岁,阿联哀悼

原来仙女不讲理
2026-06-26 00:04:44
这才既得体又有女人味的职业穿搭

这才既得体又有女人味的职业穿搭

美女穿搭分享
2026-05-09 21:36:11
武汉考生郭斌721分拿下全国第一!分数线一出,有人笑醒有人失眠

武汉考生郭斌721分拿下全国第一!分数线一出,有人笑醒有人失眠

优墨出品
2026-06-24 14:34:01
懵圈!搞不懂,森林狼这是要干啥,被尼克斯刺激了吗?

懵圈!搞不懂,森林狼这是要干啥,被尼克斯刺激了吗?

球毛鬼胎
2026-06-26 15:56:52
美国是怎么做到既繁华又破败既先进又落后的?

美国是怎么做到既繁华又破败既先进又落后的?

牛角说
2026-06-26 14:42:21
发现了吗?女人不管个子高矮,只要腰细屁股大,身材就不会差

发现了吗?女人不管个子高矮,只要腰细屁股大,身材就不会差

皓皓情感说
2026-06-19 19:56:21
重庆6月怎么这么多雨?专家:梅雨环流影响,降水量比常年偏多13%

重庆6月怎么这么多雨?专家:梅雨环流影响,降水量比常年偏多13%

上游新闻
2026-06-26 14:48:09
豆瓣9.4的国产神剧,正在被全网批判

豆瓣9.4的国产神剧,正在被全网批判

独立鱼
2026-06-27 00:05:34
高中的潜规则:60%多的人上不了本科,能上985的,不会在普高出现

高中的潜规则:60%多的人上不了本科,能上985的,不会在普高出现

好爸育儿
2026-02-12 16:04:52
大罗这辈子算是彻底安定下来了,真的人生赢家

大罗这辈子算是彻底安定下来了,真的人生赢家

南万说娱26
2026-06-25 11:15:16
清华、北大录取预估:成都七中80-90人,树德中学近40人,这些成都学子很优秀

清华、北大录取预估:成都七中80-90人,树德中学近40人,这些成都学子很优秀

爱看头条
2026-06-26 13:58:09
夏季易 “上火”,5种“败火菜” 隔三岔五吃几顿,清爽过一夏

夏季易 “上火”,5种“败火菜” 隔三岔五吃几顿,清爽过一夏

市井觅食记
2026-06-25 23:01:15
历史竟曾开了个玩笑:先倒下的不是乌克兰,而是百年中立的瑞士?

历史竟曾开了个玩笑:先倒下的不是乌克兰,而是百年中立的瑞士?

说历史的老牢
2026-06-24 07:25:52
外交部回应新西兰政府所谓涉华“内部文件”:中国坚持走和平发展道路

外交部回应新西兰政府所谓涉华“内部文件”:中国坚持走和平发展道路

环球网资讯
2026-06-26 15:44:28
女演员千万别整容,看《问心2》毛晓彤与张佳宁同框,对比很惨烈

女演员千万别整容,看《问心2》毛晓彤与张佳宁同框,对比很惨烈

娱说瑜悦
2026-06-25 23:25:33
忘了今日是对手,哈弗茨在世界杯为俱乐部队友因卡皮耶出头

忘了今日是对手,哈弗茨在世界杯为俱乐部队友因卡皮耶出头

懂球帝
2026-06-26 15:35:37
中纪委怒批:公务员也是人,正常生活不应问责处理!

中纪委怒批:公务员也是人,正常生活不应问责处理!

细说职场
2026-06-24 10:55:30
别不信!央国企裁员,最先安全的不是95后,是45岁这批“老油条”

别不信!央国企裁员,最先安全的不是95后,是45岁这批“老油条”

职场资深秘书
2026-06-26 18:25:42
2026-06-27 01:39:00
呼呼历史论
呼呼历史论
分享有趣的历史
801文章数 17342关注度
往期回顾 全部

科技要闻

拿了500亿的梁文锋,只挖地基,不信销售

头条要闻

女生被男友劫持到天台坠亡 初次约会就被灌醉发生关系

头条要闻

女生被男友劫持到天台坠亡 初次约会就被灌醉发生关系

体育要闻

我在世界杯的每次奔跑,都为了证明你没看错

娱乐要闻

玥儿不回北京,马筱梅解释后妈身份

财经要闻

"索具龙头"领大额罚单

汽车要闻

11.99万起 捷途自由者7 PLUS/山海T1四驱版上市

态度原创

房产
教育
时尚
数码
军事航空

房产要闻

全国高考大放水,300分就能上本科!论上岸率,海南没输过!

教育要闻

高考查分现场破防!班主任看着班级最后一名的成绩,当场哭到颤抖

殡葬专业,我可以干一辈子

数码要闻

乐奇Rokid发布智能眼镜操作系统YodaOS与多款软硬件新品

军事要闻

伊朗:驶离指定航线船舶不享有安全保障

无障碍浏览 进入关怀版