【技术杂技】Lombok

       在实际开发中,大家都应该会碰到一个场景:定义大量的entity,然后通过Eclipse或者IDEA去生成其属性的构造器、getter、setter、equals、hashcode、toString方法;当要对某个属性进行改变时,都需要重新生成这些方法,那Java中有没有一种方式能够解决这个问题呢?答案是有,就是lombok。

Lombok简介

       Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。

官方地址:https://projectlombok.org/
github地址:https://github.com/rzwitserloot/lombok

Lombok安装(IDEA)

       Settings -> Plugins -> Browse repositories
                      image.png
       等安装完,重启一下。因为我常用IDEA,至于Eclipse安装lombok插件,请自行百度一下。

Maven依赖

1
2
3
4
5
6
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>

常用注解介绍

Getter Setter Accessors

       @Getter @Setter修饰任何字段,让lombok自动生成默认的getter / setter方法,默认生成的方法是public的。如果要修改方法修饰符可以设置AccessLevel的值,例如:

1
@Getter(AccessLevel.PROTECTED)

@Accessors 主要用于控制生成的getter和setter,主要参数介绍:

  • fluent boolean值,默认为false。此字段主要为控制生成的getter和setter方法前面是否带get/set
  • chain boolean值,默认false。如果设置为true,setter返回的是此对象,方便链式调用方法
  • prefix 设置前缀 例如:
    1
    2
    @Accessors(prefix = "abc") private String abcAge ;
    //当生成get/set方法时,会把此前缀去掉

构造器相关

  • @NoArgsConstructor 生成一个无参构造方法。当类中有final字段没有被初始化时,编译器会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null。对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。
  • @RequiredArgsConstructor 会生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段.

    1
    2
    @RequiredArgsConstructor(staticName = "of")
    // 会生成一个of()的静态方法,并把构造方法设置为私有的
  • @AllArgsConstructor 生成一个全参数的构造方法

ToString

       ToString生成toString()方法,默认情况下,会按顺序 (以逗号分隔)打印你的类名称以及每个字段,例如:

1
User(id=null, name=null, age=null)

       可以这样设置不包含哪些字段,例如:

1
2
@ToString(exclude = "id")
@ToString(exclude = {"id","name"})

       如果继承的有父类的话,可以设置callSuper 让其调用父类的toString()方法,例如:

1
@ToString(callSuper = true)

Equals&HashCode

       @EqualsAndHashCode,生成hashCode()和equals()方法,默认情况下,它将使用所有非静态,非transient字段。但可以通过在可选的exclude参数中来排除更多字段。或者,通过在parameter参数中命名它们来准确指定希望使用哪些字段。

Data

       @Data包含了@ToString@EqualsAndHashCode@Getter / @Setter@RequiredArgsConstructor的功能

其他注解

@Synchronized:给方法加上同步锁
@Wither :提供了给final字段赋值的一种方法
@onX : 在注解里面添加注解的方式
@Builder:为你的类生成复杂的构建器API。
@Delegate:这个注解也是相当的牛逼,它会该类生成一些列的方法,这些方法都来自与List接口
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
       其他注解,查询官方文档。

Lombok问题

       Lombok 很强大,是生产力神器,语法设计合理易用,当然也很邪恶。从原理上来说,Lombok的魔法就在于其修改了AST(抽象语法树),分析和生成class阶段使用了修改后的AST,也就最终改变了生成的字节码文件。所以说,它甚至在某种程度上重新定义了 Java 本身的语法(写法),而这种“非官方”的重定义是不是会带来一系列问题也未可知,只能实践求证。以下是我开发中碰到的一些问题:

  • 无法支持多种参数构造器的重载
  • 大大降低了源代码文件的可读性和完整性,降低了阅读源代码的舒适度
  • 代码易手时带来的注解冲突、Java新手的掌握成本等等一系列问题
  • 奇淫巧技,使用会有争议
文章目录
  1. 1. Lombok简介
  2. 2. Lombok安装(IDEA)
  3. 3. Maven依赖
  4. 4. 常用注解介绍
    1. 4.1. Getter Setter Accessors
    2. 4.2. 构造器相关
    3. 4.3. ToString
    4. 4.4. Equals&HashCode
    5. 4.5. Data
    6. 4.6. 其他注解
  5. 5. Lombok问题
|