Lombok的分析与讨论

529 阅读8分钟

前言

Lombok 接触也是近些日子的事,在没有接触或者还没知道 Lombok 的时候,你的 Entity 是怎么写的?我觉得没有什么特别之处吧,它不还是老样子,定义完了属性然后就是 getter 与 setter,充其量对其构造方法进行定义与处理一下,或者相关的需要特殊处理的方法罢了。所以在没有出现或者还没去接触 Lombok 的时候,不是一样纵横开发江湖中。

近几日在网上看到一些博文对 Lombok 的使用和分析,有赞美也有抨击的,作者也准备说一下对 Lombok 的看法吧。

Lombok是什么

Lombok 是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具。简单来说,比如我们新建了一个 Entity 类,然后在其中写了几个属性,然后通常情况下我们需要手动去建立 getter 和 setter 方法啊,构造方法等等之类的,Lombok 的作用就是为了省去我们手动创建这些代码的麻烦,它能够在我们编译源码的时候自动帮我们生成这些方法(当然它还有一些其他的作用)。

Lombok如何使用

Lombok 是一个开源项目,那么 Lombok 是做什么呢?其实很简单,一个最简单的例子就是能够通过添加注解自动生成一些方法,使我们代码更加简洁易懂。例如下面一个类:(不管是 Gradle 项目还是 Maven 项目请自行引入 Lombok 支持)。

@Data
public class TestEntity {
	private String id;
	private String name;
}


public class Test {
	public static void main(String[] args) {
		TestEntity e = new TestEntity();
		e.setId("123");
		e.setName("Lee");
		System.out.println(e.getId());
		System.out.println(e.getName());
	}
}

非常简单的一段代码,我们使用 Lombok 提供的 Data 注解,在没有写 get、set 方法的时候也能够使用其 get、set 方法。如果看它编译过后的 class 文件,可以看到自动生成了 get、set 方法(当然还有一些其他方法)。

运行时注解与编译时注解

当然 Lombok 的功能不止如此,还有很多其他的注解帮助我们简便开发,网上有许多的关于 Lombok 的使用方法,这里就不再啰嗦了。正常情况下我们在项目中注解,不管是自定义的注解或者是类似 Spring 框架中的注解等等,大多都是运行时注解,运行时注解大部分都是通过反射来实现的。而 Lombok 是使用编译时注解实现的。那么编译时注解是什么呢?

注解(也被成为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。

Java 中的注解分为运行时注解编译时注解,运行时注解就是我们经常使用的在程序运行时通过反射得到我们注解的信息,然后再做一些操作。而编译时注解是什么呢?就是在程序在编译期间通过注解处理器进行处理。

  • 编译期:Java 语言的编译期是一段不确定的操作过程,因为它可能是将 xxx.java 文件转化成 xxx.class 文件的过程,也可能是指将字节码转变成机器码的过程,还可能是直接将 xxx.java 编译成本地机器代码的过程。
  • 运行期:从 JVM 加载字节码文件到内存中,到最后使用完毕以后卸载的过程都属于运行期的范畴。

如果想了解什么是运行时注解编译时注解,网上的案例很多,请自行查阅,这里不做具体研究和分析了。

Lombok的“好”与“坏”,“爱”与“恨”

如果您读到文章这个地方了,想必您对 Lombok 已经有了一段时间的了解,或者您已经用了很久了,或者是正准备使用 Lombok,有甚至您可能要放弃 Lombok 了。

从一个普通的 Entity 类说起来吧,在没有出现 Lombok 或者没使用 Lombok 的时候,您的 Entity 类肯定是各种 get、set方法,各种构造方法和一切其他的特殊处理方法。更甚至如果 Entity 类中的属性偏多的情况下,这样这个 Entity 类就会显得更加臃肿和繁琐。如果您把这些东西都认为是 Java 语言的“缺陷”,实在不敢苟同,毕竟不管是哪种计算机语言都有它的优点与缺点,如果没有这些优点与缺点,就不会有各种计算机语言出现或者是版本与版本之间的更新,这是一个良性过程。那好吧,Lombok 出现了,它可以通过简单的几个注解让您的 Entity 类变的十分清爽,它可以让您少写太多太多的代码了,简直就是“神器”。Lombok 可以让臃肿的 Entity 类一下子变得十分炫酷。

当一个新技术或者新东西出现的时候,用到的人都会觉得它是如此炫酷和带劲,但是当它出现了很久,用的人多了时间长了,那各种各样的问题就接踵而至。其实这是一个很正常的事,毕竟社会是进步的,谁都是想越来越好。那随着时间的推移,使用 Lombok 会带来哪些问题呢?作者近期读了不少有关 Lombok 的文章,大致的总结了一下:

  1. JDK版本问题。
  2. 团队开发中的问题。
  3. 代码可读性的问题。
  4. 其他问题。

其实这些问题,很好理解,很明显社会它在进步,作为程序员的您总觉得需要它更适合您才行。

有些文章里说到当在升级 JDK 版本的时候,Lombok 不能用了,不好使了。然后随着出现的问题就是将 Lombok 在代码中移除,然后一下子回到“解放前”,随后还是得自己生成 get、set方法等等。试问,如果是一个长期运转或者成型的项目或者产品,谁会去随便升级 JDK 版本。别说 JDK 新版本有些新的改进,我觉得它未必必须要用到吧,作者是一个有13年长的老码农,几年前用 JDK 1.5甚至 JDK 1.4的项目还在维护中(看到这里,老码农肯定明白我为什么把 JDK5 叫做 JDK1.5),那个时候没有 Lombok,那不是该怎么撸代码还得怎么撸啊。而且不太相信作为一个公司的领导或者老大,把公司一些成型的项目或产品最底层所谓的 JDK 随便去升级,第一没有精力,第二没人去干。说到这里了,我认为当您升级 JDK 版本从而引发 Lombok 不能用了,我觉得 Lombok 肯定在后续的版本里去解决或者更新这个问题,就是我刚才说的,任何技术的出现都有它的有点与缺点,毕竟社会是进步的,技术是不断更新的。

那么团队开发中的问题,认为项目中使用了 Lombok,作为项目参与者也得强迫安装 Lombok 的插件。作者觉得这是一件很平常不过的事情了,难道整个团队不去统一开发工具,不去统一开发规则,不去统一开发环境吗?这种情况不太可能吧。至今作者还没发现,哪个项目组开发一个项目或者产品,开发工具和开发环境五花八门的,可能会存在个别的开发工具和开发环境的配置,但是绝对不是全都不统一吧。作者公司曾经招聘过一个小姐姐程序员,当初她是大学实习来的,入职了之后发现她竟然不用鼠标,问其原因她竟然解释“不用鼠标是老师教的,搞程序用不上鼠标”。哎呀我去,不是老师传授的有误会就是这个学生理解的有偏差。是,写代码是用不上鼠标,但是它不可能老不用。别说用“触摸板”,如果您不是“触摸板”神将人员,用鼠标不是更美滋滋。emm,有点跑题。

至于一些代码可读性问题,一些其他问题。没有 Lombok 的时候没啥问题?有了 Lombok 就出问题了?!作者觉得这就是所谓的欲望唆使的呗,没 Lombok 的时候就没问题了,不能撸代码了?有 Lombok 就出问题了?!其实就是社会进步的原因罢了。

结语

Lombok 本身是一个优秀的 Java 代码库而已,它只是简化了 Java 的编码,为 Java 代码的精简提供了一种方式。但在没人要求您必须要使用 Lombok,使用 Lombok,完全是您在各种评估下,各种统一开发工具和开发环境下,结合整个团队目前的状况,来决定到底用不用 Lombok。

以前只是作者对 Lombok 的看法,博文中的内容不映射任何人与事,只是见解而已。