前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解Lombok 的使用,工作原理,优缺点

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

作者头像
秋名山码神
发布2022-12-27 17:19:45
3660
发布2022-12-27 17:19:45
举报
文章被收录于专栏:码神随笔码神随笔

文章目录


Lombok概述

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

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

Lombok的安装

第一步:安装插件 现在新版本的idea是直接默认安装Lombok插件的,如果是老版本需要先安装插件:

在这里插入图片描述
在这里插入图片描述

第二步:pom中引入依赖

代码语言:javascript
复制
<!-- 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
代码语言:javascript
复制
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
代码语言:javascript
复制
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);这串代码

加入依赖:

代码语言:javascript
复制
<!-- 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>
代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • Lombok概述
  • Lombok的安装
  • Lombok的具体使用
  • Lombok工作原理
  • Lombok的优缺点
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档