详解Lombok 的使用,工作原理,优缺点

news2025/2/24 3:00:44

文章目录

  • Lombok概述
  • Lombok的安装
  • Lombok的具体使用
  • Lombok工作原理
  • Lombok的优缺点


Lombok概述

相信大家对于lombok应该都不陌生,Lombok是一个可以大幅减少java模板代码的工具。通俗一点来说,通过添加注解的方式,不需要为类编写常用几个方法,同时可以自动化日志。

lombok官网地址:https://projectlombok.org/features/

Lombok的安装

第一步:安装插件
现在新版本的idea是直接默认安装Lombok插件的,如果是老版本需要先安装插件:
在这里插入图片描述
第二步:pom中引入依赖

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>provided</scope>
        </dependency>

Lombok的具体使用

先看俩个实例:

  1. 没有使用Lombok
import java.util.Objects;

/**
 * @Author 秋名山码神
 * @Date 2022/12/26
 * @Description
 */
public class Person {
    private Integer id;
    private String name;
    private Integer age;

    public Person() {
        
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(id, person.id) && Objects.equals(name, person.name) && Objects.equals(age, person.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, age);
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

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

    public Person(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

  1. 使用Lombok
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Objects;

/**
 * @Author 秋名山码神
 * @Date 2022/12/26
 * @Description
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private Integer id;
    private String name;
    private Integer age;
}

编译源文件,然后反编译class文件,说明@Data注解在类上,会为类的所有属性自动生setter/getter、equals、canEqual、hashCode、toString方法,@AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法,@NoArgsConstructor注解在类,生成无参构造
在这里插入图片描述
Lombok常用注解

@Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
@Getter 使用方法同上,区别在于生成的是getter方法。
@ToString 注解在类,添加toString方法。
@EqualsAndHashCode 注解在类,生成hashCode和equals方法。
@NoArgsConstructor 注解在类,生成无参的构造方法。
@RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
@AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法。
@Data 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
@Slf4j 注解在类,生成log变量,严格意义来说是常量。private static final Logger log = LoggerFactory.getLogger(UserController.class);

@Slf4j的使用

可以简单的理解为,类前面加注解@Slf4j就不用写private final Logger logger = LoggerFactory.getLogger(当前类名.class);这串代码

加入依赖:

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

/**
 * @Author 秋名山码神
 * @Date 2022/12/26
 * @Description
 */

@Slf4j
public class test {

    @Test
    public void testLog(){
        String testInfo = "Free flying flowers are like dreams";
        log.info("The test info is :{}", testInfo);
    }
}

在这里插入图片描述

Lombok工作原理

加入一个注解,无需为此写任何的代码,核心之处肯定在注解上:

Java引入注解的同时提供了俩种解析方式

  1. 运行时解析
  2. 编译时解析

这个可以参考:Java注解
Lombok就是注解编译时解析

Lombok:
1.javac对源代码进行分析,生成了一棵抽象语法树(AST)
2.运行过程中调用实现了“JSR 269 API”的Lombok程序
3.此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点
4.javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)

Lombok的优缺点

优点:

  1. 减少代码量: Lombok 可以帮助你自动生成常见的 Java 代码,
  2. 提升代码质量: Lombok 能够帮助你统一代码风格(这个因人而异)
  3. 提升开发效率: 使用 Lombok 可以节省时间,使你更加专注于业务逻辑的开发

缺点:

  1. 对于初学者来说,学习 Lombok 可能会有一定的难度。
  2. 可能会使代码变的难以理解,假如你的队友就不用Lombok
  3. 在某些情况下Lombok可能使效率下降
  4. 不支持多种参数构造器的重载

欢迎评论区补充,暂时就想到这么多,hh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stm32f407VET6 系统学习 day05 复位, 时钟,看门狗, 滴答定时器

1. 复位 1.三种类型的复位&#xff0c;系统复位&#xff0c;电源复位&#xff0c;备份复位; 2.复位作用:让程序从头开始运行&#xff0c;恢复到一开始运行的状态 2.stm32 时钟源 1. 5个是时钟源 1.HSI高速内部时钟:RC振荡器&#xff0c;频率为16MHz&#xff0c;精度不高。可…

npm中dependencies与devDependencies的区别

这个问题的出现是我下载npm包中的依赖文件安装错地方了&#xff0c;导致上线项目有问题&#xff0c;顺便一起来看看它们的区别。 一、前言 说白了就是当初学的时候太菜&#xff0c;没注意到它们的区别&#xff0c;也没去查明白。哈哈哈 二、dependencies与devDependencies的区别…

【人工智能与机器学习】——深度学习(学习笔记)

&#x1f4d6; 前言&#xff1a;长期以来&#xff0c;图像识别技术一直是人工智能研究领域的难题。近年来&#xff0c;随着算力的提升、物联网与大数据的出现、机器学习算法的快速发展&#xff0c;科学家们终于找到了有效的方法来实现图像识别&#xff0c;这就是基于人工神经网…

【OpenCV-Python】教程:8-2 图像修复 Image Inpainting

OpenCV Python 图像修复 【目标】 去除小噪声和笔画等&#xff1b; 【理论】 大多数人家里都会有一些旧照片&#xff0c;上面有一些黑点&#xff0c;一些笔画等。你想过把它修复回来吗?我们不能简单地在油漆工具中删除它们&#xff0c;因为它只会用白色结构取代黑色结构&a…

代码随想录拓展day4 143.重排链表;141. 环形链表;面试题 02.07. 链表相交

代码随想录拓展day4 143.重排链表&#xff1b;141. 环形链表&#xff1b;面试题 02.07. 链表相交 关于链表的一些应用&#xff0c;基本都用到了快慢指针的思路。对于单链表来说&#xff0c;确定边界&#xff0c;也就是遍历时的终止条件非常重要。 143.重排链表 143. 重排链表…

Web前端105天-day65-ToolChain

ToolChain01 目录 前言 一、Webpack 二、指南 总结 前言 ToolChain01学习开始 一、Webpack 官网&#xff1a;webpack 浏览器仅支持: html css 和 js 三种语言实际开发中: 会使用到其他的一些语言, 例如 TS, sass, scss 等.... 这些语言开发起来更加方便快捷, 但是浏览器不…

pinia 笔记

1、安装 npm i pinia -S2、创建store基本结构 1、在src下创建store文件夹并创建app.js文件&#xff0c;同时编写基本代码结构 // 引入实例化store的函数 import { defineStore } from "pinia";// 实例出一个名为app的store,那appStore是什么&#xff1f;它代表当前…

【SpringMVC】SpringMVC实现文件上传

1.一般的文件上传 1.1 文件上传的必要前提 form 表单的 enctype 取值必须是&#xff1a;multipart/form-data(默认值是:application/x-www-form-urlencoded) enctype:是表单请求正文的类型 method 属性取值必须是 Post 提供一个文件选择域<input type"file" /&…

代码随想录二刷day2

代码随想录复习 文章目录代码随想录复习209.长度最小的子数组&#xff08;滑动窗口&#xff09;76.最小覆盖子串904.水果成篮59.螺旋矩阵2螺旋矩阵1209.长度最小的子数组&#xff08;滑动窗口&#xff09; 209.长度最小的子数组 复习一下滑动窗口&#xff0c;滑窗的复杂度还是…

MySQL时间查询讲解+实战教学(查询本月、上个月、下个月等等的数据)

MySql时间查询 MySql查询当前时间 查询 年-月-日 时:分:秒 select now() 查询 年-月-日 select DATE(CURDATE()) 查询 年-月 select date_format(NOW(),%Y-%m) 查询当前年 select YEAR(CURDATE()) 查询当前月 select MONTH(CURDATE()) 查询当前日 select DAYOFMONTH(NOW()) 查…

【论文简述】Efficient Multi-view Stereo by Iterative Dynamic Cost Volume(CVPR 2022)

一、论文简述 1. 第一作者&#xff1a;Shaoqian Wang、Bo Li 2. 发表年份&#xff1a;2022 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;MVS、深度学习、动态代价体、GRU、迭代优化 5. 探索动机&#xff1a;由于正则化步骤需要较多的GPU内存和处理时间&#xff0c…

大话JMeter4|不同的并发数可以自动化做压测吗?

1080709 23.5 KB 上节课爱画漫画的小哥哥用漫画形式向大家展示了JMeter的进阶用法&#xff1a;如何搭建InfluxDB&#xff0c;使用更炫酷的Grafana。 看到很多小伙伴觉得看的不过瘾&#xff0c;在强烈的催促下&#xff0c;小哥哥的新文章又出来了。这次小哥哥又给我们带来怎样的…

vue + nodejs + npm

node.js下载 1、如图所示&#xff1a; 2、建立node_cache、node_global文件夹&#xff1a; 然后运行以下2条命令 npm config set prefix “D:\node-v14.15.0-win-x64\node_global” npm config set cache “D:\node-v14.15.0-win-x64\node_cache” 执行npm list -global查看&…

编译原理——求短语、直接短语(简单短语)、素短语、句柄

先介绍一下短语、直接短语&#xff08;简单短语&#xff09;、素短语、句柄怎么求&#xff1a;这个图是核心 然后通过一些例题&#xff0c;实战一下&#xff1b; 根据上面介绍的概念、求法&#xff0c;应用一下即可&#xff1b; 例题1 短语&#xff1a;注意对于每一个子树&a…

数字孪生技术助力高炉数字化建设的可行性

随着数字孪生等新一代信息技术的快速发展&#xff0c;数字化转型已成为企业重塑竞争优势的关键举措。依托数字孪生技术&#xff0c;对炼铁高炉进行物联网、数字化信息系统建设&#xff0c;实现了高炉运行状态的数字化监测与预警&#xff0c;数字孪生系统凭借在数字化、模型化、…

利用WordPress搭建属于自己的网站

怎么用WordPress给自己搭建了一个网站&#xff1f;可能很多人都想拥有属于自己的网站&#xff0c;这篇文章就找你怎么利用WordPress搭建属于自己的网站。如果你也正好有搭建个人网站的想法&#xff0c;那么本文会给你一个参考&#xff0c;我尽量写的比较详细&#xff0c;给自己…

【Ctfer训练计划】——(五)

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

Java on VS Code 11月更新|VS Code Java 开发者超200万!

作者&#xff1a;Nick Zhu - Senior Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;我们很高兴与大家分享一个好消息&#xff0c;现在 Visual Studio Code 上已有超过 200 万 Java 开发者&#xff0c;这离不开长期以来社区以…

JavaSE笔记——异常、断言

文章目录前言一、处 理 错 误1.异常分类2.声明受查异常3.如何抛出异常4.创建异常类二、捕获异常1.捕获异常2.捕获多个异常3.再次抛出异常与异常链4.finally 子句5.带资源的 try 语句三、使用断言1.断言的概念2.启用和禁用断言3.使用断言完成参数检查总结前言 在现实世界中却充…

由浅入深学安全-1

由浅入深学安全 常用术语解析 肉鸡 肉鸡也称傀儡机&#xff0c;是指可以被黑客远程控制的机器。 比如用灰鸽子等诱导客户点击或者电脑被黑客攻破或用户电脑有漏洞被种植了木马&#xff0c;黑客可以随意操纵它并利用它做任何事情。 一句话木马 一句话木马主要用来配合菜刀…