Java Record可以完全取代Lombok吗?

Java record类用法简介 ⏹Java record类用法简介 阅读详情

很长时间以来,Java 都因其冗长而受到一些开发者的诟病。哪怕是最热衷 Java 的开发者或许也不得不承认,声明一个只有两个属性的 bean 类Java让人觉得有点可笑。因为如果遵循推荐规范,最终不仅添加了 getter 和 setter方法,还要添加toString, hashcode 和 equals 方法的重写,最终大块的样板文件式的代码逼得开发者想放弃Java语言。

Java

复制import java.util.Objects;
public class Car {
private String brand;
private String model;
private int year;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", model='" + model + '\'' +
", year=" + year +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return year == car.year && Objects.equals(brand, car.brand) && Objects.equals(model, car.model);
}
@Override
public int hashCode() {
return Objects.hash(brand, model, year);
}
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.

幸运的是,Lombok的横空出世大大减轻了Java开发者的痛苦。但自从有了与其作用相似的Java Record类型,有人可能会问:Record是否可以全面取代Lombok呢?

1.Lombok是什么?

Lombok是一个与开发环境高度集成的 Java 类库(当然也可以看成一种语法糖),通过注解改进(spice)代码,它在 Java 社区中被广泛接受和使用。

使用了Lombok后,我们新建一个名为Car的类是这样的:

Java

复制import lombok.Data;
@Data
public class Car {
private String brand;
private String model;
private int year;
}1.2.3.4.5.6.7.

代码更加简洁,同时也不会影响之前版本的任何功能。

2.Java Record是什么?

定义的每一个Java Record类型可以简单地看做是值对象(Value Object)模式的实现。它本质还是一个 Java 类,其中所有的属性都是final的。所以在创建对象时所有类属性都需要传递。Java Record是在 Java 14中引入的,它将持续改进,提升类设计。

通过Record新建Car类是这样的:

Java

复制public record Car(String brand, String model, int year) 
{1.2.

与前一个版本对比,改进非常明显。

下文将分析Lombok的一些特性,并通过和Record进行比较来评估是否可以永久让Lombok退出历史舞台。

3.不可变性

Record默认情况下是不可变的,这意味着所有的类属性都被隐式的声明为 final。我们通常认为Record和值对象(Value Objects)很相似,但是它们没有 setter 方法,所有的值都需要在构造函数中传递。Lombok可以使用@Value 注解达成同样的效果,但也可以使用@Data注解来保持可变性。

Java

复制import lombok.Value;
@Value
public class Car {
private String brand;
private String model;
private int year;
}1.2.3.4.5.6.7.

4.Bean公约

Record并不打算遵循 bean的公约,获取对象的方法不使用 getX 的方式命名,同时也不再提供 setter 方法和无参的构造函数。另一方面,Lombok只需使用@Data注解就可以将一个类轻松转换为 JavaBean。

5.Builder

Builder构建器模式是改善对象、创建语法很棒的一种设计模式。Lombok为我们提供了@Builder这个很实用的注解,它帮我们实现了所有样板代码。到目前为止,Java Record 并不打算提供此类实现。

Java

复制import lombok.Builder;
@Builder
public class Car {
private String brand;
private String model;
private int year;
public static void main(String[] args) {
Car myCamaro = Car.builder()
.brand("Chevrolet")
.model("Camaro")
.year(2022)
.build();
}
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.

6.多fields类

Record只对少量fields的类是友好的。但是,如果再向其中添加10个fields,那么得到的会是一个庞大的构造函数(繁多的入参),随之而来的还有多参构造函数所带来的固有的问题(传参易错位,方法重载难判断等)。

Java

复制public record DetailedCar(
String brand, String model, int year,
String engineCode, String engineType, String requiredFuel,
String fuelSystem, String maxHorsePower, String maxTorque,
float fuelCapacity) {
}1.2.3.4.5.6.

Java

复制DetailedCar camaroDetailed = new DetailedCar(
"Chevrolet", "Camaro", 2022, "LTG", "Turbocharged",
"Gas I4", "Direct Injection", "275 @ 560", "295 @ 3000-4500",
19.0f);1.2.3.4.

使用了Lombok,我们就可以决定创建bean类是选择使用 setter来设置对象的状态,还是使用builder这种更简洁的方式来构造实例。唯一需要注意的是,因为其默认不会强制设置所有属性,所以可能使实例处于属性不完整状态。当然@Builder 注解支持我们将类中所有属性标记为@nonNull,这样在构建时属性就是必需的。如果必需属性缺失设置则会在运行时抛出一个异常,而不是编译时强制抛出异常。

Java

复制import lombok.Builder;
import lombok.NonNull;
@Builder
public class DetailedCar {
@NonNull
private String brand;
@NonNull
private String model;
@NonNull
private int year;
@NonNull
private String engineCode;
@NonNull
private String engineType;
@NonNull
private String requiredFuel;
@NonNull
private String fuelSystem;
@NonNull
private String maxHorsePower;
@NonNull
private String maxTorque;
@NonNull
private float fuelCapacity;
public static void main(String[] args) {
DetailedCar camaroIncomplete = DetailedCar.builder()
.brand("Chevrolet")
.model("Camaro")
.year(2022)
.build();
}
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.

输出:

复制Exception in thread "main" java.lang.NullPointerException: engineCode is marked non-null but is null1.

7.继承

到目前为止,Java Record类是不支持继承的,所以不能通过扩展其他Record类来创建一个新的Record类,这可能是模型设计的一个限制。尽管如此,我们也要认识到组合优于继承(面向对象设计原则之七)。

Java

复制@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class Car extends MotorVehicle {
private String brand;
private String model;
private int year;
}1.2.3.4.5.6.7.8.

8.结论

Record是Java的一个极佳的新特性,它正推动代码向更简洁的方向发展,因此应该多多使用。对于提供了众多功能的Lombok,考虑到Java变更的缓慢速度,要在项目中将其彻底取代似乎还为时尚早。

 

Record 类和 lombok的思考 摘自百度Lombok是一个java库,它可以自动插入到编辑器和构建工具中,增强java的性能。不需要再写getter、setter或equals方法,只要有一个注解,你的类就有一个功能齐全的构建器、自动记录变量等等。根据大佬的话Lombok是一个与开发环境高度集成的 Java 类库(当然也可以看成一种语法糖),通过注解改进(spice)代码,它在 Java 社区中被广泛接受和使用。使用record可以让我们避免手写getter和setter方法。 阅读详情

相关推荐

Lombok vs Java Record:谁才是未来?

摘要: Java开发者常面临样板代码问题,Lombok通过注解自动生成代码显著提升效率,但依赖第三方库。Java 16引入的Record语法原生支持不可变数据对象,代码更简洁。对比显示,Lombok适合可变对象和复杂构建场景,而Record更适用于不可变数据载体。未来,随着JDK 17+普及,Record可能逐步取代Lombok的部分功能,但老项目可渐进迁移,新项目可优先使用Record。两者并非对立,可根据场景结合使用。

你好,我是橙序员 1016

【JAVA学习之路 | 进阶篇】Record(记录)与密封类(sealed)

下午更。

2301_80912559的博客 623

使用Java 17中的record替代Lombok的部分功能

Lombok和record都可以帮助我们编写更加整洁的代码。前者是第三方库,可能存在一些不可预知的问题和IDE兼容问题,但功能更加全面和强大;后者属于Java原生的能力,功能虽弱一些,但用好它也能帮助我们减少很多代码的编写,且IDE兼容性更好。好了,今天的分享就到这里。如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步!更多Java新特性教程可以点击直达!欢迎关注我的公众号:程序猿DD。前沿技术早知道,弯道超车有希望!积累超车资本,从关注DD开始!

程序猿DD 1688

Java 17 record 类学习

Java 17 record 类学习

engchina的专栏 3528

Java自动生成getter/setter的3种终极方案:IDE、Lombok、Record谁更强?

本文探讨了Java开发中自动生成getter/setter方法的三大方案:IDE工具、Lombok注解和Java 14+的Record Components。通过代码示例和性能对比,揭示了手动编写方法的低效性(效率差距达100%),并分析了不同方案的适用场景:IDE适用于快速开发和企业项目(QPS提升100倍),Lombok能减少80%代码量,而Record Components则提供不可变支持和原生性能优势。文章结合电商和金融案例,建议新项目优先使用Record,旧项目采用Lombok,团队协作选择IDE

java专栏 1914

Java record vs lombok

Java的record关键字是Java14中引入的一个新的语义特性。record对于创建小型不可变的对象非常有用。另一方面,Lombok是一个Java库,可以自动生成一些已知的模式为Java字节码。尽管它们都可以用来减少模板代码,但它们是不同的工具。因此,我们应该在特定情况下使用更适合我们需求的工具。在这篇文章中,我们将探讨各种使用情况,包括javarecord的一些限制。对于每个例子,我们将看到Lombok如何派上用场,并比较这两种解决方案。...

20年码农 544

告别Lombok,拥抱Java Record类

想获取更多高质量的Java技术文章?欢迎访问Java技术小馆官网,持续更新优质内容,助力技术成长Java技术小馆官网在Java开发的世界里,我们总是在寻找那些能让代码更简洁、更优雅的方式。多年来,Lombok成为了众多开发者的得力助手,它通过注解魔法消除了大量的样板代码。然而,随着JDK 14引入并在JDK 16正式确立的Record类型,Java终于拥有了自己的"瑞士军刀"来应对数据类的处理。这个看似简单的语法糖,却蕴含着改变代码风格的巨大潜力。

u013257321的博客 950

Java21 Record实战:从Lombok到原生支持的优雅转型

本文深入探讨了Java开发者如何从依赖Lombok转向使用JDK 21原生支持的Record特性。通过对比手写、Lombok与Record在代码简洁性、依赖管理和不可变性等方面的差异,文章阐述了Record作为不可变数据载体的优势,并提供了从基础定义到与Spring、Jackson等框架集成的实战指南,助力开发者实现优雅转型,构建更简洁、稳固的代码。

weixin_29216353的博客 194

使用Java 17中的 record 替代 Lombok 的部分功能

在DD长期更新的Java新特性专栏中,已经介绍过Java 16中开始支持的新特性:record的使用:2分钟学会Java中record关键字的用法之前只是做了介绍,但没有结合之前的编码习惯或规范来聊聊未来的应用变化。最近正好因为互相review一些合作伙伴的代码,产生了一些讨论话题,主要正针对于有了record之后,其实之前有些用Lombok的场景,是可以替换掉的。今天我们就来小小的总结下,我们可...

程序猿DD 1334

告别手动维护!教你用SAP BAPI批量更新生产订单BOM组件(CO02工单)

本文详细介绍了如何利用SAP BAPI实现生产订单BOM组件的批量更新,解决传统手工操作(如CO02工单)效率低下的问题。通过核心函数解析和批量处理框架设计,帮助用户大幅提升工作效率,降低错误率,适用于物料主数据变更、季节性配方调整等场景。

weixin_30844577的博客 561

四旋翼无人机控制算法实战:从PID到MPC的路径跟踪

本文深入探讨了四旋翼无人机控制算法的演进路径,从基础的PID控制到高级的MPC算法,详细解析了各类算法的原理、实现技巧及适用场景。通过实战案例对比分析,为开发者提供从算法选型到参数调优的全方位指导,助力提升无人机飞行控制的精度与稳定性。

weixin_29090917的博客 243

Java Record vs Lombok:开发效率全面对比

结果显示Record的反序列化速度比Lombok快约15%,这可能是因为Record的标准化结构让Jackson能更好地优化。Lombok虽然通过注解减少了手写代码,但实际生成的字节码包含了更多样板方法,整体体积比Record大30%左右。这对于大型项目可能会有累积影响。在实际编码中,Record的语法简洁性优势明显:自动生成equals/hashCode/toString,不需要插件支持,IDE兼容性更好。原因是Record的底层实现更接近原生Java对象,而Lombok生成的类带有额外的元数据。

AmberLeopard26的博客 901

金融级IT架构-数字银行的云原生架构解析

最近断断续续花了差不多2到3周的时间阅读完由电子工业出版社出版的《金融级IT架构:数字银行的云原生架构解密》的这本书,作者是作者是网商银行技术编委会。 本书契合了当前银行业分布式架构转型趋势,内容是经过实践检验的领先技术介绍了网商银行IT技术架构演进路线,涵盖了分布式、单元化、弹性混合云、云原生多个基础架构领域,同时介绍了技术风险、安全可信、业务架构等多方面的技术实践经验。 对于这本书实际很早搜索云原生相关书籍的时候就搜索到,但是一看标题是金融IT架构方面的因此没有引起太多的重视,后面由华章...

年少有为 4065

Java Record 详解

Java Record 通过极简语法和不可变性,显著减少了数据类的样板代码,同时提升了代码安全性和可维护性。其适用于 DTO、模式匹配、函数式编程等场景。

weixin_45466242的博客 5836

[RK3399][Android7.1] 调试笔记 --- 编译GSL5680 touch提示错误

Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 现象: 之前在rk3288平台上使用过GSL5680的Touch,现在移植过来一直报如下错误: make[1]: `include/generated/vdso-offsets.h' is up to date. CHK include/generated/compi...

Kris Fei's blog 1056

开源数显表

开源数显表,广泛应用于车床、铣床、磨床、镗床、火花机、线切割等。市面上此类液晶数显表多数都是基于此项目。 一、基本配置 硬件 主控:STM32F407VGT6 LCD:群创AT070TN92 显示驱动:RA8875 光栅尺:3 x 输入(X/Y/Z) 串口:1 x MAX3232 继电器:2 x 输出 存储:AT24C64 模拟输入:LM324C 电源:AC 220V 软件 工程版本:Keil 5 STM32库:V1.4.0 图形界面:uCGUI 多语言支持:中文、英文 二、项目文

m0_70934529的博客 440

Java中Record类能完全替代Lombok吗?

本文探讨了Java中Record类能否替代Lombok工具库的问题。Record类作为数据结构表示方式,提供基本属性和方法;Lombok则专注于代码简化与高效开发。两者在功能特点和应用场景上各有所长:Record类适合快速生成代码和简化数据操作,而Lombok更适用于Spring框架中的常用功能。结论指出Record类可作为Lombok的替代选择,但能否完全替代需根据具体需求判断。开发者应综合考虑功能、场景和使用成本,选择最适合的工具库。

searchboy2025的博客 129

《AgentScope-Java 深入浅出教程》第10章 RAG 知识检索

RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索与文本生成相结合的技术架构。它通过从外部知识库中检索相关文档,将检索到的信息作为上下文注入到语言模型的提示中,从而增强模型的回答质量。│ RAG 工作流程 ││ ││ 用户问题 向量检索 上下文增强 生成回答 ││ ▼ ││ │ A │ ││ ││ 1. 接收问题 ││ 2. 将问题转换为向量,在知识库中检索相似文档 ││ 3. 将检索到的文档作为上下文添加到提示词中 │。

步子哥的博客 462

record 替代 lombok, 我觉得不行

相比于传统的Java类,使用record可以让我们更加专注于数据本身,而不是getter和setter方法的实现。同时,它还可以减少代码的冗余,提高代码的可读性和可维护性。值得注意的是,虽然record提供了许多便利的功能,但并不适用于所有的情况,有些情况下我们仍需要手写Java类和对应的方法。

洪晓鸿 2162

【RT-DETR实战】117、华为昇腾CANN部署探索:从模型转换到推理踩坑实录

本文总结了RT-DETR模型在昇腾310B芯片上部署的关键挑战与解决方案。主要遇到四大问题:1)模型转换时需注意ONNX导出设置,建议先固定尺寸验证;2)内存布局差异导致推理异常,需精确匹配NHWC/NCHW格式;3)流水线并发优化中内存复用和异步处理是关键;4)调试阶段需利用专用工具逐层比对。作者提出六条实用建议,包括小尺寸验证、预处理对齐、内存池设计等,强调部署是持续适配过程,需建立完整的测试体系应对工具链迭代。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 195

32、高光谱遥感技术在军事领域的应用解析

高光谱遥感技术凭借其高分辨率和精细光谱分析能力,在军事领域广泛应用于战场详细侦察、伪装目标识别及目标实际温度与发射率的检测,显著提升了目标识别精度和作战支持能力。同时,该技术在内陆水体成分反演、海洋环境监测和农业管理等领域也展现出巨大潜力。尽管面临数据量大、处理复杂、技术融合不足和仪器性能限制等挑战,未来通过人工智能融合、高效算法研发和先进仪器开发,高光谱遥感技术将在多领域实现更深入应用与发展。

blue的专栏 235

Java record VS lombok谁更甚一筹?

Java的 record 关键字是Java 14中引入的一个新的语义特性。record 对于创建小型不可变的对象非常有用。另一方面,Lombok 是一个Java库,可以自动生成一些已知的模式为Java字节码。尽管它们都可以用来减少模板代码,但它们是不同的工具。因此,我们应该在特定情况下使用更适合我们需求的工具。在这篇文章中,我们将探讨各种使用情况,包括java record 的一些限制。对于每个例子,我们将看到Lombok如何派上用场,并比较这两种解决方案。

m0_73735578的博客 585

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java Record

Record 通过构造方法创建了只读的对象,能够读取每个属性,不能设置新的属性值。Record 用于创建不可变的对象,同时减少了样板代码。

???? 2759

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java 17 vs Java 8 (2) : record 关键字 详解 & 与 Lombok @Value 对比

Java record 关键字是 Java 14 中引入的一个新的语义特性,对于创建小型不可变对象非常有用。return y;if(!} }用 record 关键字修饰的类相当于:提供以 private final 修饰的成员变量和对应的公共访问 get 方法;全参的构造方法;提供 equals, hashCode, toString 方法。

Stephanie17395的博客 3499

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JDK14的新特性:Lombok的终结者record

文章目录简介新的Record类型探讨Record的秘密record扩展总结 JDK 14的新特性:Lombok的终结者record 简介 自从面向对象产生之后,程序界就开始了新的变化,先是C发展到了C++,后面java横空出世,大有一统江湖的趋势。 面向对象凭借其结构化的特点和在大型项目中的优势,一路蓬勃发展到今。面向对象不是不好,但是太繁琐。 比如我们要定义一个简单的存储数据的结构,比如说Use...

程序那些事 1万+

Java编程笔记31:Record

总的来说,Record 的用途相对简单和直接,就是充当一个“透明的数据载体”,而 Lombok 除了直接使用@Value注解外,还可以结合其它注解更灵活地定制一个类型。

梦幻天空 1915
上一篇: Python和Go,谁才是编程语言的“王者”?
下一篇: 为什么微服务一定要有API网关?
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值