​Lombok:让我来提高你的开发效率

Lombok是一个 IDE 插件,安装之后可以节省我们写 getter、setter、toString 方法的时间,支持 Java 开发的绝大数编辑器,例如 IDEA、Eclipse 等。

为什么别人的代码这么简洁,而我的代码充斥着 getter 和 setter 方法。是别人的实体类不需要外界访问吗,当然不是,只是因为别人使用了 Lombok。

以上代码就是 Lombok 一个最常用的场景,在实体类中省略书写 getter 和 setter 方法。如果你的实体类属性要被外接访问,那么必然要有对应的 getter 和 setter 方法,而这两类方法通常情况下都是千篇一律的,如果是纯手写那必然很麻烦。对此,各个编辑器也相当了,比如在 IDEA 中就可以通过「Generate」来快速生成 getter、setter、toString 等。

但终究还是需要手动操作,而且如果属性很多,生成的setter、getter 方法会很多,实体类看起来就没那么清爽。而通过 Lombok 的一个 @Data 注解,就解决了问题。

如何使用呢

文章开头已经说了,Lombok 就是一个编辑器的插件。所以,要使用它,首先得在你所用的 IDE 上安装它。

第一步:安装插件

我用的是 IDEA,安装步骤很简单,打开 IDEA 1、设置(首选项设置) -> Plugins;2、点击 Browse repositories…;3、在搜索框中搜索 Lombok Plugin;4、点击右侧的 Install 按钮;5、重启 IDEA 即可。

如果你是用的其他编辑器,到 Lombok 官网查询一下对应的安装方式,官网地址放到文末了。点击上方菜单项 Install 找到对应的编辑器即可。

第二步:引入 Lombok 依赖包

目前最新包版本为 1.18.12 ,用 Maven 方式引入。


 org.projectlombok  
 lombok  
 1.18.12  
 provided

然后你就可以在项目中愉快的使用了。

如果你的项目不仅仅是你个人使用,而是团队项目,那么使用之前,要确保团队中其他成员也要安装 Lombok 插件才可以,否则会出现编译错误。

先说原理

通过上述安装和引入依赖包,你就可以在项目中使用 Lombok 提供的注解来简化开发了。那么,通过注解就可以少这么多代码,它到底是用了什么神奇的技术呢。

其实并不是使用了注解之后那些冗余的 getter、setter 就不存在了,而是 Lombok 在编译的时候帮你做了而已。也就是说你在 Java 代码中确实看不到了,但其实编译好的 class 文件中是有相应的代码的。

Java 6 之后,javac 开始支持「Pluggable Annotation Processing API」技术,javac 我们都知道是用来编译的。Lombok 实现了自定义的 Pluggable Annotation Processing API。于是在代码进行编译的时候,就会调用到 Lombok 自定义的注解解析器,通过指定注解的 @Retention(RetentionPolicy.SOURCE) ,允许在编译器对注解进行解析,而不是在运行期解析。

所以在我们编译完代码后,在编译出的 .class 文件中可以看到 Lombok 为我们动态添加的代码。

通过下面这个编译前后的代码对比,可以清晰的看出 Lombok 的效果。

我定义了一个简单实体类,定义了三个属性,原始代码是这样的,用了 @Data@Builder 两个注解。

@Data
@Builder
public class User {
   private String name;
   private int age;
   private int gender;
}

下面是编译之后生成的 .class 文件代码,代码很长,有 130 多行,我把一些较长的方法体省略了,可以想象,如果这些都靠手写,工作量是很大的。

public class User {
   private String name;
   private int age;
   private int gender;
   User(String name, int age, int gender) {
       this.name = name;
       this.age = age;
       this.gender = gender;
  }
   public static User.UserBuilder builder() {
       return new User.UserBuilder();
  }
   public String getName() {
       return this.name;
  }
   public int getAge() {
       return this.age;
  }
   public int getGender() {
       return this.gender;
  }
   public void setName(String name) {
       this.name = name;
  }
   public void setAge(int age) {
       this.age = age;
  }
   public void setGender(int gender) {
       this.gender = gender;
  }
   public boolean equals(Object o) {
       // // 省略
  }
   protected boolean canEqual(Object other) {
       return other instanceof User;
  }
   public int hashCode() {
       // 省略
       return result;
  }
   public String toString() {
       return "User(name=" + this.getName() + ", age=" + this.getAge() + ", gender=" + this.getGender() + ")";
  }
   public static class UserBuilder {
       // 省略
  }
}

支持的注解

上面简单介绍了一下原理,再介绍一下 Lombok 常用的注解。

上面这张图是官网上列出的稳定支持的一些注解,另外还有一些处于试验阶段的注解没有列出。

我比较常用就是 @Data@Log@NonNull

@Data

@Data 是  @ToString@EqualsAndHashCode@Getter@Setter , @RequiredArgsConstructor 这几个注解的合集,生成读写方法、重写 toString、生成带参数的构造函数、重写 equals 方法。当然,你也可以拆开来单独使用其中的一个。

在上面那个例子中可以看出来效果。

@Log

@Log 是使用  java.util.logging.Logger 日志记录器,一般我们使用的日志框架都是 Slf4j、log4j。

比如我最常用的日志框架是 Slf4j,那么我直接在需要使用的类上添加 @Slf4j 注解。

下面是我写的一个使用 @Slf4j 的例子。

@Slf4j
public class Log {
   public static void main(String args[]){
       Log l = new Log();
       l.a();
  }
   public void a(){
       log.info("hello lombok");
  }
}

编译后的代码如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Log {
   private static final Logger log = LoggerFactory.getLogger(Log.class);
   public Log() {
  }
   public static void main(String[] args) {
       Log l = new Log();
       l.a();
  }
   public void a() {
       log.info("hello");
  }
}

自动引入了 slf4j 包,并声明了 Logger。当然前提是你要在项目中添加 slf4j 相关的依赖包, Lombok 是不会帮你自动添加依赖的。

@NonNull

@NonNull 是设置属性不允许为空。

另外,还有一些同学比较喜欢用 @Builder ,使用这个注解后,就可以用下面的方式来创建实体对象了。

User user = User.builder().build();
user.setName("古时的风筝");

其他的几个注解也有其对应的应用场景,用的时候再去详细学习吧。

缺点

有利就有弊,使用 Lombok 可以提高一些效率。但是,也存在一些弊端。

1、使用之后,会降低代码的可读性,大量的代码 Lombok 帮你在编译的时候才生成,那么你在 IDE 中想定位一些代码就定位不到。

2、当你使用 Lombok 之后,使用你代码的人必须也安装上才可以。

权衡利弊之后,你就可以决定用还是不用了,依我的经验来看,弊端在日常工作开发中几乎没有什么实际影响。

还可以读:

你了解 Spring Boot Starter 吗

———————–

公众号:古时的风筝

一个斜杠程序员,一个纯粹的技术公众号,多写 Java 相关技术文章,不排除会写其他内容。

【谢谢你点了个在看】