Lombok 使用教程

项目中使用 Lombok

  1. 项目添加 Lombok 的 Maven 依赖:
1
2
3
4
5
6
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
  1. IDEA 安装 Lombok 插件:

idea-lombok-plugin

  1. IDEA 启用 Annocation Processors:

idea-lombok-plugin-2

  1. 使用 Lombok 提供的注解:
  • @Getter
  • @Setter
  • @ToString
  • @EqualsAndHashCode
  • @NonNull
  • @NoArgsConstructor
  • @RequiredArgsConstructor
  • @AllArgsConstructor
  • @Data
  • @Builder
  • @Log
  • @Cleanup
  • @SneakyThrows

使用 Lombok 的优点

  • 减少代码维护:新增属性的时候,会减少非常多的代码维护工作
  • 减少模板代码:Lombok 对大量的模板代码进行了封装,可以减少重复代码

使用 Lombok 的缺点

1) 侵入性太强:Lombok 的使用要求开发者一定要在 IDE 中安装对应的插件,如果项目组中使用了 Lombok,那么所有开发人员都必须安装 IDE 插件,否则就没办法协同开发。

2) 降低代码可读性:在项目中使用了 Lombok,确实可以帮忙减少很多代码,但是这些代码是要在编译阶段才会生成的,所以在开发的过程中,其实很多代码其实是缺失的。大量使用 Lombok,就导致代码的可读性降低,而且也会给代码调试带来一定的问题。比如,想要知道某个类中的某个属性的 Getter 方法都被哪些类引用的话,就没那么简单了。

3) 容易踩坑:在使用 Lombok 过程中,如果对于各种注解的底层原理不理解的话,很容易产生意想不到的结果。举一个简单的例子,当使用 @Data 定义一个类的时候,会自动帮我们生成 equals() 方法,但是如果只使用了 @Data,而不使用 @EqualsAndHashCode(callSuper=true) 的话,会默认是 @EqualsAndHashCode(callSuper=false),这时候生成的 equals() 方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放,这就可能得到意想不到的结果。

4) 影响升级:因为 Lombok 对于代码有很强的侵入性,这就可能带来一个比较大的问题,那就是会影响日后对 JDK 版本的升级。按照如今 JDK 的升级频率,每半年都会推出一个新的版本,但是 Lombok 作为一个第三方工具,并且是由开源团队维护的,那么 Lombok 的迭代速度是无法保证的。如果日后需要升级到某个新版本 JDK 的时候,若其中的特性在 Lombok 中不支持的话就会受到影响。还有一个可能带来的问题,就是 Lombok 自身的升级也会受到限制,因为一个应用可能依赖了多个 Jar 包,而每个 Jar 包可能又要依赖不同版本的 Lombok,这就导致在应用中需要做版本仲裁,而 Jar 包版本仲裁是没那么容易的,而且发生问题的概率也很高。

5) 破坏封装性:使用 Lombok 会破坏封装性,众所周知,Java 的三大特性包括封装性、继承性和多态性;如果在代码中直接使用 Lombok,那么会自动生成 Getter、Setter 等方法,这就意味着一个类中的所有参数都自动提供了设置和读取方法。