百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Java 引入 Lombok , 看这一篇就够了

lipiwang 2025-06-09 23:25 2 浏览 0 评论

什么是 Lombok

Java 语言的排名一直名列前茅,但是有时候我们的代码与业务无关,并且过于冗长,并例如在实体类中,经常写很多 getter 或者 setter 方法。
这时候我们使用 Lombok 来使用一些功能,使其代替我们把 Java 字节码自动编译到 class 文件中。

Lombok 配置

目前作者在用的 idea 版本为 2022.1.1 ,已经默认集成了 Lombok 插件,低版本的 idea 可以自行去插件库安装 Lombok 插件。

Maven 引入 Lombok 依赖

这里是Lombok更新日志与可用版本

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

在 pom.xml 中引入的上述依赖,可以看到 scope 是 provided 状态,此状态表示此依赖只在编译与测试时有效,当我们项目打包成 *.jar 的时候并不会打入进去。

为什么要使用 Lombok

很多技术我们会有疑问,就是为什么要用这项技术?下面来揭晓
引入 Lombok 前 , 我们的实体类

package com.test;

public class TestModel {
    private String name;
    private Integer age;
    private String sex;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

可以看到上面的实体代码中,已经多了很多 get 与 set 方法,这还是处于实体属性字段少的情况下。平时项目开发过程中,属性字段存在 30+ 的时候,大约会有 180+ 行 get 与 set 方法冗余代码。整个实体很臃肿。这个时候我们引入 Lombok 看下

package com.test;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class TestModel {
    private String name;
    private Integer age;
    private String sex;

    public static void main(String[] args) {
        TestModel model = new TestModel();
        model.setName("张三");
    }
}

我们加入了@Setter与@Getter注解后,这时 Lombok 会代替我们在编译的时候,去 class 文件增加 get 与 set 方法。
经常使用的时候,还会使用一个 @ToString 的注解,这时候发现类上已经追加了三个注解,再算上我们 swagger 和 jpa 等注解。

注解太多? 没事,有聚合注解 @Data

通常,我们最常用的 Lombok 中的注解就是 @Data .

简化 set 与 get 方法

日常使用下的 set 方法是这样操作的

TestModel model = new TestModel();
model.setName("张三");
model.setAge(18);

get 方法是如下这样的

System.out.println(model.getName() + "-" + model.getAge());

get*() 与 set*() 写多了也会降低开发效率,并且看起来并不是很直观,因为这些大多是与逻辑无关的操作。

使用 @Accessors(chain = true) 注解

@Data
@Accessors(chain = true)
public class TestModel {
    private String name;
    private Integer age;
    private String sex;

    public static void main(String[] args) {
        TestModel model = new TestModel().setName("张三").setAge(18);
    }
}

当字段繁多的时候,我们使用这种链式的 set 方式使代码更加直观与整洁。

Ps: 细节注意

@Accessors(fluent = true)不要与 fastjson 一起使用,反序列化会有 bug。

实体建造者模式

以下代码为设置一个 api 请求的实体

public class ApiSettings {
    private String host;
    private int port;
    private String username;
    private String password;
    // 其他字段
    // 空构造方法
}

像上述这种情况,我们希望当创建完成一个 api 请求的设置后不会被 set 方法更改,这时需要设计一个建造者模式的实体。使用 Lombok 的优点又体现出来,我们参考如下代码,使用 @Builder 注解。

@Builder
public class ApiSettings {
    // ... 类中代码保持不变
}

下面我们使用此模式来构建一个 api 请求类,如下:

ApiSettings.builder()
        .host("127.0.0.1")
        .port(8080)
        .username("admin")
        .password("admin")
        .build();

空构造方法

当只使用 @Data 注解的时候,会存在默认的空构造方法,也就是相当于存在 @NoArgsConstructor 。

当增加注解@AllArgsConstructor后,反编译 class 如下:

ApiSettings(final String host, final int port, final String username, final String password) {
    this.host = host;
    this.port = port;
    this.username = username;
    this.password = password;
}

会增加一个全属性构造,这个时候再去 new 实体的空构造就会报错,就需要创建空构造或者引入@NoArgsConstructor 了。

作者:程序员鱼丸
链接:
https://juejin.cn/post/7102785140979400735

相关推荐

Redis 常见面试问题总结和答案(redisson面试题)

什么是Redis?Redis(RemoteDictionaryServer)Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Ke...

青云QingCloud新增Memcached功能 完善缓存集

北京2015年1月30日电/美通社/--基础云服务商青云QingCloud日前宣布,为了更好的满足用户对缓存服务多样性的需求,正式推出基于Memcached的缓存集群服务。此次发布的M...

还不懂什么是Redis?一文详解Redis,入门学习看这一篇就够了

在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量...

redis一些常见的面试题(附答案)(redis经典面试题)

1、什么是redis?Redis是一个基于内存的高性能key-value数据库。2、Reids的特点  Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统...

Java面试官最爱问的那些Redis面试题盘点

一、概述二、数据类型STRINGLISTSETHASHZSET三、数据结构字典跳跃表四、使用场景计数器缓存查找表消息队列会话缓存分布式锁实现其它五、Redis与Memcached数据类型数据持久化...

Redis为什么「操作速度」这么快以及在实际开发中的「应用场景」

Redis在目前分布式开发大环境下应用的场景比较多,但是大家有没有思考过为什么大家都愿意使用Redis呢?以及Redis为什么速度会这么快的原因呢?还有我们实际开发过程中使用Redis的场景又有哪些呢...

Redis分片(分布式缓存)(redis分片存储)

分片(partitioning)就是将你的数据拆分到多个Redis实例的过程,这样每个实例将只包含所有键的子集.(相关推荐:Redis教程)1分片何用Redis的分片承担着两个主要目标:o允...

您应该了解的20大系统设计概念(系统设计有哪些)

您应该了解的20大系统设计概念我应该从基础开始,比如可扩展性、可用性、可靠性这些。这些都是系统设计的核心要素。接下来,可能需要考虑性能相关的,比如延迟和吞吐量,这两者常常被一起讨论。然后是存储,数据库...

一文彻底弄懂 TPS RPS QPS(tps/cps)

以下是关于RPS、QPS、TPS的核心区别与关联的总结,结合实际场景和优化建议:一、核心定义与区别RPS:RequestsPerSecond每秒请求数客户端到服务器的完整请求数量Web服务...

redis,memcached,nginx网络组件

1.理解阻塞io,非阻塞io,同步io,异步io的区别2.理解BIO和AIO的区别io多路复用只负责io检测,不负责io操作阻塞io中的write,能写多少是多少,只要写成功就返回,譬如准备写500字...

为什么 Redis 单线程却能支撑高并发?

#暑期创作大赛#为什么Redis单线程却能支撑高并发?Redis和memcached有什么区别?Redis的线程模型是什么?为什么Redis单线程却能支撑高并发?这个是问Redis的...

值得一看的35个Redis面试题总结(redis面试题汇总)

Redis是一个基于内存的高性能key-value数据库。作者:民工哥1.什么是redis?Redis是一个基于内存的高性能key-value数据库。2.Reids的特点  Redis本质上是一...

内存数据库优缺点一览:Redis、Memcached、MongoDB和Ignite

内存数据库是一种将数据存储在内存中的数据库,相比于传统的磁盘数据库,内存数据库具有更高的性能、更低的延迟和更好的并发能力。内存数据库广泛应用于高速缓存、实时分析、游戏、社交网络等场景。本文将对比介绍四...

Java面试 | 关于Redis 的面试题(redis面试题2021)

1.Redis是什么?Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因...

数字化与智能化技术:分布式缓存数据库Redis

一、Redis概述Redis远程字典服务(RemoteDictionaryServer),是一个开源的使用ANSIC语言编写的,基于内存的分布式缓存Key-Value数据库。1、Redis数据...

取消回复欢迎 发表评论: