27

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

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzAxMjA0MDk2OA%3D%3D&%3Bmid=2449469289&%3Bidx=1&%3Bsn=45794cdee6ab81a1ec15d5087e4ffc82
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

2AZ3qaF.jpg!web

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

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

UzYZVbF.png!web

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

如何使用呢

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

第一步:安装插件

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

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

N7rmAbZ.jpg!web

第二步:引入 Lombok 依赖包

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

<dependency>
 <groupId>org.projectlombok</groupId>  
 <artifactId>lombok</artifactId>  
 <version>1.18.12</version>  
 <scope>provided</scope>
</dependency>

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

如果你的项目不仅仅是你个人使用,而是团队项目,那么使用之前,要确保团队中其他成员也要安装 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 常用的注解。

b6NBnm2.jpg!web

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

我比较常用就是 @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 相关技术文章,不排除会写其他内容。

qme6RfA.jpg!web

【谢谢你点了个在看】

BBR7riA.png!web

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK