lombok详解(代码片段)

Harris-H Harris-H     2022-12-18     426

关键词:

Lombok详解

Project Lombok

​ Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
​ Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.

一、导入依赖

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

二、Lombok 注解概览

Lombok 插件主要为我们提供了如下注解,这里对其做一个简单的汇总。各个注解详细的介绍以及用法,可以参考我后续的文章。

  • @Getter 注解在属性(类)上,为属性(所有非静态成员变量)提供 get() 方法
  • @Setter 注解在属性(类)上,为属性(所有非静态成员变量)提供 set() 方法
  • @ToString 该注解的作用是为类自动生成 toString() 方法
  • @EqualsAndHashCode 为对象字段自动生成 hashCode() 和 equals() 实现
  • @AllArgsConstructor、@RequiredArgsConstructor、@NoArgsConstructor 顾名思义,为类自动生成对应参数的构造器
  • @Data 注解在类上,自动为所有字段添加 @ToString、@EqualsAndHashCode、@Getter。为非 final 字段添加 @Setter 和 @RequiredArgsConstructor。本质上相当于几个注解的综合效果
  • @Value 注解和 @Data 类似,区别在于它会把所有成员变量默认定义为 private final 修饰,并且不会生成 set() 方法
  • @Log、@Log4j、@Log4j2、@Slf4j、@XSlf4j、@CommonsLog、@JBossLog 注解在类上,自动为类添加对应的日志支持
  • @NonNull 注解在方法参数上,用于自动生成空值参数检查,自动帮助我们避免空指针
  • @Cleanup 自动帮我们调用 close() 方法,作用在局部变量上,在作用域结束时会自动调用 close() 方法释放资源,可以关闭流
  • @Builder 注解在类上,被注解的类加个构造者模式
  • @Synchronized 注解在类上,加个同步锁
  • @SneakyThrows 等同于 try/catch 捕获异常

常用注释

1. @Getter/@Setter

自动产生 getter/setter

2. @ToString

自动重写 toString() 方法,会印出所有变量

3. @EqualsAndHashCode

自动生成 equals(Object other)hashcode() 方法,包括所有非静态变量和非 transient 的变量

如果某些变量不想要加进判断,可以透过 exclude 排除,也可以使用 of 指定某些字段

Q : 为什么只有一个整体的 @EqualsAndHashCode 注解,而不是分开的两个 @Equals@HashCode

A : 在 Java 中有规定,当两个对象 equals 时,他们的 hashcode 一定要相同,反之,当 hashcode 相同时,对象不一定 equals。所以 equals 和 hashcode 要一起实现,免得发生违反 Java 规定的情形发生

4. @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

这三个很像,都是在自动生成该类的构造器,差别只在生成的构造器的参数不一样而已

@NoArgsConstructor : 生成一个没有参数的构造器

@AllArgsConstructor : 生成一个包含所有参数的构造器

这里注意一个 Java 的小坑,当我们没有指定构造器时,Java 编译器会帮我们自动生成一个没有任何参数的构造器给该类,但是如果我们自己写了构造器之后,Java 就不会自动帮我们补上那个无参数的构造器了

然而很多地方(像是 Spring Data JPA),会需要每个类都一定要有一个无参数的构造器,所以你在加上 @AllArgsConstructor 时,一定要补上 @NoArgsConstrcutor,不然会有各种坑等着你

@RequiredArgsConstructor : 生成一个包含 “特定参数” 的构造器,特定参数指的是那些有加上 final 修饰词的变量们

补充一下,如果所有的变量都是正常的,都没有用 final 修饰的话,那就会生成一个没有参数的构造器

5. @Data

整合包,只要加了 @Data 这个注解,等于同时加了以下注解

  • @Getter/@Setter
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor

@Data 是使用频率最高的 lombok 注解,通常 @Data 会加在一个值可以被更新的对象上,像是日常使用的 DTO 们、或是 JPA 裡的 Entity 们,就很适合加上 @Data 注解,也就是 @Data for mutable class

6. @Value

也是整合包,但是他会把所有的变量都设成 final 的,其他的就跟 @Data 一样,等于同时加了以下注解

  • @Getter (注意没有setter)
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor

上面那个 @Data 适合用在 POJO 或 DTO 上,而这个 @Value 注解,则是适合加在值不希望被改变的类上,像是某个类的值当创建后就不希望被更改,只希望我们读它而已,就适合加上 @Value 注解,也就是 @Value for immutable class

另外注意一下,此 lombok 的注解 @Value 和另一个 Spring 的注解 @Value 撞名,在 import 时不要 import 错了

7. @Builder

自动生成流式 set 值写法,从此之后再也不用写一堆 setter 了

注意,虽然只要加上 @Builder 注解,我们就能够用流式写法快速设定对象的值,但是 setter 还是必须要写不能省略的,因为 Spring 或是其他框架有很多地方都会用到对象的 getter/setter 对他们取值/赋值

所以通常是 @Data 和 @Builder 会一起用在同个类上,既方便我们流式写代码,也方便框架做事

8. @Slf4j

自动生成该类的 log 静态常量,要打日志就可以直接打,不用再手动 new log 静态常量了

除了 @Slf4j 之外,lombok 也提供其他日志框架的变种注解可以用,像是 @Log、@Log4j…等,他们都是帮我们创建一个静态常量 log,只是使用的库不一样而已

@Log //对应的log语句如下
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());

@Log4j //对应的log语句如下
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);

SpringBoot默认支持的就是 slf4j + logback 的日志框架,所以也不用再多做啥设定,直接就可以用在 SpringBoot project上,log 系列注解最常用的就是 @Slf4j

9.@NonNull

  • 方法参数上

Lombok将在方法/构造函数体的开头插入一个空检查,并将参数的名称作为消息引发一个NullPointerException

  • 字段上

任何为该字段赋值的生成方法也将生成这些空检查

10.@Cleanup

简介
自动资源管理:自动调用关闭资源方法,默认是调用close()方法

在finally块中,只有在给定资源不是null的情况下才会调用清理方法

如果要清理的对象没有close()方法,可以指定一个无参方法来进行自动清理:

@Cleanup("dispose") CoolBar bar = new CoolBar(parent, 0);

基本使用

public class CleanupExample 
  public static void main(String[] args) throws IOException 
    @Cleanup InputStream in = new FileInputStream(args[0]);
    @Cleanup OutputStream out = new FileOutputStream(args[1]);
    byte[] b = new byte[10000];
    while (true) 
      int r = in.read(b);
      if (r == -1) break;
      out.write(b, 0, r);
    
  

等价于

public class CleanupExample 
  public static void main(String[] args) throws IOException 
    InputStream in = new FileInputStream(args[0]);
    try 
      OutputStream out = new FileOutputStream(args[1]);
      try 
        byte[] b = new byte[10000];
        while (true) 
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        
       finally 
        if (out != null) 
          out.close();
        
      
     finally 
      if (in != null) 
        in.close();
      
    
  


其他特性

var 与 val

(1)var、val 关键字可以让我们在定义一个变量时候不需要提前指定它的类型,它的实际的类型将由初始化的表达式推断:

  • var 所声明的变量是非 final 的。
  • val 所声明的变量是 final 的。
var example = new ArrayList<String>();
example.add("welcome to hangge.com");
val foo = example.get(0);

(2)上面代码将会翻译成如下 Java 程序:

ArrayList example = new ArrayList<String>();
example.add("welcome to hangge.com");
final String  foo = example.get(0);

Lombok的优缺点

优点:

  1. 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
  2. 让代码变得简洁,不用过多的去关注相应的方法
  3. 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等

缺点:

  1. 不支持多种参数构造器的重载
  2. 虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度

参考文章

官方文档

传送门1

传送门2

idea安装lombok及使用详解(代码片段)

目录①为什么使用②如何安装1.安装lombok插件:  2.添加lombok的maven的pom.xml依赖: 3.实体类示例代码Student.java4.测试类LombokTest.java  5.输出结果:  ③常用且特殊注解①为什么使用 项目中经常使用bean,entity等类,... 查看详情

springbootspringboot日志文件详解(代码片段)

...日志对象打印日志5.日志持久化6.更简单的日志打印方式lombok6.1lombok介绍6.2lombok注解说明6.3使用@Slf4j注解打印日志6.4lom 查看详情

intellijidea安装lombok及使用详解

...成或删除get/set等方法,给代码维护增加负担。而使用了lombok则不一样,使用了lombok的注解(@Se 查看详情

详解springboot集成mybatis(代码片段)

...基础上有些步骤可以进一步简化,加速开发过程。1、lombok插件使用https://blog.csdn.net/daniaoxp/article/details/119381941在第5步骤中新建了Student类,设置了id,name,age,score变量,接着进行参数的set,get方法࿰... 查看详情

有争议的神器——lombok(代码片段)

Lombok详解简介maven依赖lombok插件安装简介lombok可以通过简单的注解的形式来帮助我们简化和消除一些必须有但显得很臃肿的Java代码,比如常见的Getter&Setter、toString()、构造函数等等。lombok不仅方便编写,同时也让我们... 查看详情

springboot日志详解(代码片段)

...化5.1配置文件名5.2配置保存路径六、更简单的日志输出--lombok6.1添加lombok依赖6.2输出日志6.3lombok原理解释6.4lombok更多注解说明一、日志有什么用日志是程序的重要组成部分。想象⼀下,如果程序报错了,不让你打开控制台... 查看详情

lombok(代码片段)

Lombokjavalibraryplugsbuildtoolswithoneannotationyourclass使用步骤:在IDEA中安装Lombok插件!在项目中导入lombok的jar包<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifact 查看详情

springboot集成lombok,让代码优雅起来(代码片段)

一、Lombok简介    (1)Lombok官网(https://projectlombok.org/)对lombok的介绍  (2)GitHub项目地址:https://github.com/rzwitserloot/lombok  虽然是生硬的翻译,大家也大致可以看到Lombok存在的价值和意义,Lombok主要是可以提高开发效... 查看详情

lombok常见注解(代码片段)

一、使用lombok简化代码lombok提供了很多注解,在编译时候生成java代码,代替了手工编写一些简单的代码,使程序员可以关注更重要的实现。二、常用注解以model为例publicclassDataDemoprivateIntegerid;privateStringname;privateDatetime;一下是添... 查看详情

lombok介绍(代码片段)

Lombok是什么Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法.官方地址: https://projectlombok.org/ github地址:&n... 查看详情

详解springboot集成mybatis(代码片段)

...基础上有些步骤可以进一步简化,加速开发过程。1、lombok插件使用https://blog.csdn.net/daniaoxp/article/details/119381941在第5步骤中新建了Student类,设置了id,name,age࿰ 查看详情

plugin--lombok(代码片段)

1.Lombok作用:  Lombok是开源的代码生成库,是一款非常实用的小工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的JavaBean。通过注解,Lombok可以帮我们自动装配getter()、setter()、toString()、hashCode()和equals()这样的... 查看详情

lombok(代码片段)

Lombok是一种Java实用工具,可用来帮助开发人员消除Java的冗长,尤其是对于简单的Java对象(POJO)。它通过注解实现这一目的。拿lombok官网的一个例子来说:1publicclassUsers2privateStringname;3privateStringpass;4privateIntegerage;5要使用这个对象,... 查看详情

解决引入lombok注解不生效(代码片段)

Eclipse    -javaagent:lombok.jar-vmargs-javaagent:lombok.jar   查看详情

lombok(代码片段)

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.10</version></dependency>ViewCode  查看详情

lombok(代码片段)

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.10</version></dependency>ViewCode  查看详情

idea安装lombok插件(代码片段)

一,前言lombok是什么?lombak是一个工具,主要用来简化,减少代码的编写。使代码看起来更清晰,简洁。而且lombok只是一个工具,不会打包到war中,不会增加任何消耗。只是在编译期中帮助我们完成额外的工作。例如getter/setter... 查看详情

lombok简介使用工作原理优缺点(代码片段)

文章目录1.Lombok简介2.Lombok使用2.1添加maven依赖2.2安装插件2.3解决编译时出错问题2.4示例2.5常用注解3.Lombok工作原理4.Lombok的优缺点1.Lombok简介官方介绍ProjectLombokisajavalibrarythatautomaticallyplugsintoyoureditorandbuildtools,spicingupyourjava. 查看详情