最简单的Lombok教程及其原理

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 最简单的Lombok教程及其原理,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

使用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. 这样注解就还原成原始的模样,这样就可以清晰知道注解的作用
    在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135318.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!