深入Lombok
# 30.深入Lombok
来讲解Lombok的原理、缺点等
# 原理
Java 的编译过程大致可以分为三个阶段:
- 解析与填充符号表
- 注解处理
- 分析与字节码生成
编译过程如下图所示:
而 Lombok 正是利用「注解处理」这一步进行实现的,Lombok 使用的是 JDK 6 实现的 JSR 269: Pluggable Annotation Processing API (编译期的注解处理器) ,它是在编译期时把 Lombok 的注解代码,转换为常规的 Java 方法而实现优雅地编程的。
比如,我们用JD-GUI反编译下class文件:可以看到自动生成了setter和getter,hashcode等方法
Java类在编译期被注解翻译器修改成了常规的 Java 方法,添加 Getter、Setter、equals、hashCode 等
# Lombok 优缺点
Lombok 的优点很明显,它可以让我们写更少的代码,节约了开发时间,并且让代码看起来更优雅,它的缺点有以下几个。
缺点1:降低了可调试性。Lombok 会帮我们自动生成很多代码,但这些代码是在编译期生成的,因此在开发和调试阶段这些代码可能是“丢失的”,这就给调试代码带来了很大的不便。
缺点2:可能会有兼容性问题。Lombok 对于代码有很强的侵入性,加上现在 JDK 版本升级比较快,每半年发布一个版本,而 Lombok 又属于第三方项目,并且由开源团队维护,因此就没有办法保证版本的兼容性和迭代的速度,进而可能会产生版本不兼容的情况。
缺点3:可能会坑到队友。尤其对于组人来的新人可能影响更大,假如这个之前没用过 Lombok,当他把代码拉下来之后,因为没有安装 Lombok 的插件,在编译项目时,就会提示找不到方法等错误信息,导致项目编译失败,进而影响了团结成员之间的协作。
缺点4:破坏了封装性。面向对象封装的定义是:通过访问权限控制,隐藏内部数据,外部仅能通过类提供的有限的接口访问和修改内部数据。
也就是说,我们不应该无脑的使用 Lombok 对外暴露所有字段的 Getter/Setter 方法,因为有些字段在某些情况下是不允许直接修改的,比如购物车中的商品数量,它直接影响了购物详情和总价,因此在修改的时候应该提供统一的方法,进行关联修改,而不是给每个字段添加访问和修改的方法。
综上,是否使用Lombok,还需看情况
# 推荐阅读
本文主要参考了:
- Lombok官网 (opens new window)
- Lombok,嗯,真香香香香香香! (opens new window)
- 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个! (opens new window)