最简单的Lombok教程及其原理

使用Lombok

一、如何使用 Lombok

  • 首先IDE必须安装插件才能支持 lombok。插件安装教程自行搜索
  • Maven 项目引入依赖,请自行依赖最新版本(也可以不指定版本,继承spring)
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
    <optional>true</optional>
</dependency>

二、常用注解

常用注解

常用的就@Data、@NoArgsConstructor、@AllArgsConstructor、@Slf4j(变量名是log)

注解分析
  • @Data
生成set/get/toString/equals/hashCode/canEqual/无参构造器。详细参考**反编译研究**
  • @Setter
  • @Getter
  • @ToString
用法有:
* ToString(exclude="column") 排除column列所对应的元素【多字段用数组】

* @ToString(of="column")
只生成包含column列所对应的元素的参数的toString方法【多字段用数组】

* 详细生成的toString有没有用StringBuilder,亦或仅使用+号相连,详细参考**反编译研究**。(对于JDK8,加号相连会被优化成StringBuilder)
  • @NoArgsConstructor
  • @AllArgsConstructor
  • @EqualsAndHashCode
  • @Slf4j
  • @Log4j
  • @Log4j2
  • @Builder:不能直接new对象,必须使用builder模式

三、使用的细节

1、自己写的set/get/toString等可以覆盖注解生成的方法
package com.example.boothelloworld2.zzzother;

import lombok.Data;

/**
 * 测试自己写的set、get、toString是否会覆盖lombok生成的。
 * 结论:会的!
 */
@Data
public class TestLombok01 {
    private String name;

    public String getName() {
        System.out.println("自己写的get方法会覆盖lombok生成的吗?会");
        return name;
    }

    public void setName(String name) {
        System.out.println("自己写的set方法会覆盖lombok生成的吗?会");
        this.name = name;
    }

    @Override
    public String toString() {
        return "覆盖注解生成的的toString方法";
    }

    public static void main(String[] args) {
        TestLombok01 t = new TestLombok01();
        t.setName("stone");
        t.getName();

        System.out.println(t);
    }
}
2、关于static/final/static final
  • static方法不生成set、get
  • final变量无set,有get方法
  • static final方法不生成set、get方法
package com.example.boothelloworld2.zzz_other;

import lombok.Data;

/**
 * 测试satic、final和static final的变量的set、get情况
 *
 * 结论:static方法不生成set、get;final变量无set有get方法,static final方法不生成set、get方法
 */
@Data
public class TestLombok03 {
    private static String staticVar;
    private final String FINAL_VAR = "FINAL_VAR_VALUE";
    private static final String STATIC_FINAL_VAR = "STATIC_FINAL_VAR_VALUE";

    public static void main(String[] args) {
        TestLombok03 t = new TestLombok03();

//        t.getFINAL_VAR(); // 存在

//        t.setFINAL_VAR();// final变量无set方法
//         static变量不生成set、get方法
        // static final变量也不生成set、get方法
    }
}

3、关于serialVersionUID

该字段是static final 的,lombok不会生成set、get(可自行手动生成,仅可生成get)

4、关于@EqualsAndHashCode

如果不写字段,则表示用所有字段作为条件,如果写了,则使用指定的属性,如@EqualsAndHashCode(of={"name", "userEmail"})则表示用这两个属性生成对应的equals和hashCode方法

作用:Set和Map的key判断是否重复就是看equals和hashCode,这就是使用这个注解的意义

坑:但是不建议使用该注解。因为:

如果@EqualsAndHashCode中of的变量名写错,如写成`@EqualsAndHashCode(of={"name", "age2"})`,如果`age2`属性不存在,编译也不报错,观察生成的源码,age2字段丢失(相当于只写了name字段),这个问题 **相当隐蔽,若增删属性、修改属性名但忘记改注解,很容易埋下bug,建议还是不用该注解**

四、反编译

我们想知道使用了注解等价于什么。可以使用 IDEA的 Delombok功能来查看。步骤如下

  1. 选择文件,右键,选择Refactor,找到Delombok(注意如果未使用注解将无此选项)
  2. 选择需要delombok的注解,也可以选所有
  3. 这样注解就还原成原始的模样,这样就可以清晰知道注解的作用
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值