# 到底应不应该使用 lombok

**URL:** <https://www.isharkfly.com/t/lombok/14036>\
**Category:** 程序语言\
**Tags:** java\
**Created:** [July 12, 2022, 3:57pm UTC](https://www.isharkfly.com/t/lombok/14036 "2022-07-12T15:57:22Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [July 12, 2022, 3:57pm UTC](https://www.isharkfly.com/t/lombok/14036/1 "2022-07-12T15:57:22Z")

</div>

对使用 lombok 还是有很多争议的，有些公司不建议使用，有些公司又大量使用。

 ![1_Jt34KK87zw10NOLYqU-CNQ](https://com-ossez-www-discourse.s3.dualstack.us-east-2.amazonaws.com/discourse-uploads/original/2X/b/b3eda9e1fd7f73701138ca5ddfc94343dc31c24b.jpeg)

我们的想法是：可以使用，但是不要滥用。

## 什么是 lombok

Lombok是 一种Java™实用工具，可用来帮助开发人员消除Java的冗长代码，尤其是对于简单的Java对象（POJO） 。 它通过注释实现这一目的。 通过在开发环境中实现Lombok，开发人员可以节省构建诸如hashCode() 和 equals()这样的方法以及以往用来分类各种 accessor和 mutator的大量时间。

我们都知道使用 Java 定义对象的时候都会用到 Getter 和 Setter 方法。

虽然我们有工具帮我们快速生成这些方法，但是实际上还是有点麻烦。

lombok 就可以通过一行注释来实现所有的这些方法。

lombok 可以做的不仅仅是这个，还可以通过注释 `@Slf4j` 来帮你实现自动定义 log。

我们就不用写冗长的 `private static final Logger logger = LoggerFactory.getLogger(ListingProcessor.class)` 这句话了。

而且针对 log 的类不同，这句话也是不同的。

## 如何使用

如果使用 Maven 的话，直接添加下面的依赖到 pom 文件中就可以了。

```auto
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>provided</scope>
        </dependency>

```

IDEA 的插件是自动安装的，你直接启用就可以了。

IDEA 会提示你是不是在当前的项目中启用 lombok，你可以选择启用或者不启用。

 ![2022-07-12_11-51-23](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/3X/9/3/937f155c91ada82d668899ab34da6da262df1d14.png)

随后就是在代码中使用注释就可以了。

如下面的代码，我们直接简化使用注解就可以了。

 ![5ac0d5e07fecd93bacd7c148542f10878094c7ea](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/3X/3/1/318ee0b7ec4b76fc0f7cc6485ef251f8863185a1.png)

需要注意的是，使用 log 来标记日志。

 ![f5f84be80c29c5dba406693dfe719e7ce5a54113](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/3X/5/8/58f191f778da96ff319f33311aa36654b6b52cd7.png)

这样看起来，代码就优雅很多，也能减少不少不需要的代码。

## lombok 的原理和滥用

Java 程序的解析分为：`运行时解析` 和 `编译时解析`。

通常我们通过反射获取类、方法、注解和成员变量就是`运行时解析`。但是这种方式效率其实不高，要在程序运行起来才能解析。

这时候编译时解析就体现出它的价值了。

编译时解析又分为：`注解处理器（Annotation Processing Tool）`和  
`JSR 269 插入式注解处理器（Pluggable Annotation Processing API）`

第一种处理器它最早是在 JDK 1.5 与注解（Annotation） 一起引入的，它是一个命令行工具，能够提供构建时基于源代码对程序结构的读取功能，能够通过运行注解处理器来生成新的中间文件，进而影响编译过程。

不过在JDK 1.8以后，第一种处理器被淘汰了，取而代之的是第二种处理器。

这样就导致了 lombok 对 JDK 的兼容性出现了一些问题。

当你更换 JDK 版本的时候，lombok 的版本也需要一并进行更换，否则你就会出现错误。

如果下面文章讨论的错误： [Java 项目编译错误 Error:java: java.lang.ExceptionInInitializer](https://www.isharkfly.com/t/java-error-java-lang-exceptionininitializer/243)

就是因为 JDK 不兼容的问题导致的整个项目无法编译。

如果上游系统中提供的fegin client 使用了 lombok，那么下游系统必须也使用 lombok，否则会报错，上下游系统构成了强依赖。

如果你需要对 getter 或者 setter 方法进行一些编码的话，lombok 也不是不能用，但是会有一点点的学习曲线。

综合上面的考虑， lombok 还是可以用的，但是不要尝试所有地方都用 lombok，避免滥用。

哪怕就是为了使用 `@Slf4j` 来考虑的话，也是值得的。
