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 之后,使用你代码的人必须也安装上才可以。
权衡利弊之后,你就可以决定用还是不用了,依我的经验来看,弊端在日常工作开发中几乎没有什么实际影响。
还可以读:
———————–
公众号:古时的风筝
一个斜杠程序员,一个纯粹的技术公众号,多写 Java 相关技术文章,不排除会写其他内容。
【谢谢你点了个在看】