为什么要使用Lombok
Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 JavaBean的冗长。
每个JavaBean都会充斥着如上述getter,setter,equals,hashCode和toString的模板代码,这看起来很冗长(Java是这样的)。
使用Lombok后,IDE便可以识别其注解,比如使用Lombok的@Getter和@Setter注解后,你的代码不需要再写getset方法,会看起来很苗条,如果你觉得类名上一大坨注解看起来好别扭,Lombok还提供了一个组合注解@Data,可以替换掉类名头上那一坨注解。
Lombok的安装
一、导入maven依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
二、安装插件
点击File->Settings->Plugins,寻找Lombok并安装,如下图所示:
三、开启注释处理器( AnnocationProcessors)
点击File->Settings->Build,Execution,Deployment->Compiler->AnnocationProcessors,选中项目(Smart-Parking)开启Enable,如下图三所示:
Lombok注解的使用
@Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。
@ToString:作用于类,覆盖默认的toString()方法,可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。
@EqualsAndHashCode:作用于类,覆盖默认的equals和hashCode。
@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器。
@Data:作用于类,是以上注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor。
@NonNull:主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:作用于类上,用于生成构造函数。有staticName、access等属性。staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。
@NoArgsConstructor:生成无参构造器。
@AllArgsConstructor:生成全参构造器。
@Builder:作用于类上,将类转变为建造者模式。
未使用Lombok前的代码
public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
public Long getId(){
return id;
}
public void setId(Long id){
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public int getGender(){
return gender;
}
public void setGender(int gender){
this.gender = gender;
}
@Override
public boolean equals(Object o){
if(this == o){
return true;
}
if(o == null || getClass() != o.getClass()){
return false;
}
MyObject obj = (MyObject) o;
return age = obj.age &&
gender = obj.gender &&
Objects.equals(id,obj.id) &&
Objects.queals(name,obj.name);
}
@Override
public int hashCode(){
return Objects.hash(id,name,age,gender);
}
@Override
public String toString(){
return "MyObject{"+
"id="+id+
"name="+name+
"age="+age+
"gender="+gander+
"}";
}
}
使用Lombok后的代码
@Data
public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
}
为什么不推荐使用Lombok
看完上面的神操作是不是觉得这个玩意非常NB,刚开始用的时候确实是这样的.
但是,所有的源代码很多时候是用来阅读的,只有很少的时间是用来执行的。
引入Lombok让我的项目一时爽,但一时爽的代价是随着项目推进,技术债务开始累积。
使用Lombok将带来以下问题:
-
JDK版本问题
当我想要将现有项目的JDK从Java 8升级到Java 11时,我发现Lombok不能正常工作了。于是我不得不将所有的Lombok注解从项目源代码中清除,并使用IDE自带的功能生成getter/setter,equals,hashCode,toString以及构造器等方法,你也可以使用Delombok工具完成这一过程。但这终究会消耗你很多的时间。 -
胁迫使用
当你的源代码中使用了Lombok,恰好你的代码又被其他的人所使用,那么依赖你代码的人,也必须安装Lombok插件(不管他们喜不喜欢),同时还要花费时间去了解Lombok注解的使用情况,如果不那么做,代码将无法正常运行。使用过Lombok之后,我发现这是一种很流氓的行为。 -
可读性差
Lombok隐藏了JavaBean封装的细节,如果你使用@AllArgsConstructor注解,它将提供一个巨型构造器,让外界有机会在初始化对象时修改类中所有的属性。首先,这是极其不安全的,因为类中某系属性我们是不希望被修改的;另外,如果某个类中有几十个属性存在,就会有一个包含几十个参数的构造器被Lombok注入到类中,这是不理智的行为;其次,构造器参数的顺序完全由Lombok所控制,我们并不能操控,只有当你需要调试时才发现有一个奇怪的“小强”在等着你;最后,在运行代码之前,所有JavaBean中的方法你只能想象他们长什么样子,你并不能看见。 -
代码耦合度增加
当你使用Lombok来编写某一个模块的代码后,其余依赖此模块的其他代码都需要引入Lombok依赖,同时还需要在IDE中安装Lombok的插件。虽然Lombok的依赖包并不大,但就因为其中一个地方使用了Lombok,其余所有的依赖方都要强制加入Lombok的Jar包,这是一种入侵式的耦合,如果再遇上JDK版本问题,这将是一场灾难。 -
得不偿失
使用Lombok,一时觉得很爽,但它却污染了你的代码,破坏了Java代码的完整性,可读性和安全性,同时还增加的团队的技术债务,这是一种弊大于利,得不偿失的操作。如果你确实想让自己的代码更加精炼,同时又兼顾可读性和编码效率,不妨使用主流的Scala或Kotlin这一基于JVM的语言。