最近上网查资料发现很多人对lombok
褒贬不一,引起了我的兴趣,因为我们项目中也在大量使用lombok
,大家不同的观点让我也困惑了几天,今天结合我实际的项目经验,说说我的个人建议。
这些人建议使用 lombok
,觉得它是一个神器,可以大大提高编码效率,并且让代码更优雅。
这些人觉得它有一些坑,容易给项目埋下隐患,我们到底该听谁的呢?
在没使用lombok
之前,我们一般是这样定义javabean的:
public class User {
private Long id;
private String name;
private Integer age;
private String address;
public User() {
}
public User(Long id, String name, Integer age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public String getAddress() {
return address;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id) &&
Objects.equals(name, user.name) &&
Objects.equals(age, user.age) &&
Objects.equals(address, user.address);
}
@Override
public int hashCode() {
return Objects.hash(id, name, age, address);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
该User
类中包含了:成员变量、getter/setter方法、构造方法、equals、hashCode方法。
咋一看,代码还是挺多的。而且还有个问题,如果User
类中的代码修改了,比如:age字段改成字符串类型,或者name字段名称修改了,是不是需要同步修改相关的成员变量、getter/setter方法、构造方法、equals、hashCode方法全都修改一遍?
也许有些朋友会说:现在的idea非常智能,可以把修改一次性搞定。
没错,但是有更优雅的处理方法。
第一步,引入jar包
org.projectlombok
lombok
1.18.4
provided
第二步,在idea中安装插件
注意:如果不按照插件idea中就无法编译使用lombok
注解的代码。
第三步,在代码中使用lombok
注解
上面的User
类代码可以改成这样:
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class User {
private Long id;
private String name;
private Integer age;
private String address;
}
so good,代码可以优化到如此简单。User
类的主体只用定义成员变量,其他的方法全都交给注解来完成。
如果修改了成员变量名称或者类型,怎么办呢?
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class User {
private Long id;
private String userName;
private String age;
private String address;
}
你只用一心一意修改成员变量即可,其他的根本不用操心,简直太爽了。
更让人兴奋的是,还能进一步优化:
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
private Long id;
private String userName;
private String age;
private String address;
}
@Data相当于@Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor的集合。
lombok
注解整理如下:
从上面看出使用lombok
给人最大的感受是代码量显著减少了,能够有效的提升开发效率,而代码看起来更优雅,确实是一个不可多得的神器。
java程序的解析分为:运行时解析
和 编译时解析
。
通常我们通过反射获取类、方法、注解和成员变量就是运行时解析
。但是这种方式效率其实不高,要在程序运行起来才能解析。
这时候编译时解析就体现出它的价值了。
编译时解析又分为:注解处理器(Annotation Processing Tool)
和 JSR 269 插入式注解处理器(Pluggable Annotation Processing API)
第一种处理器它最早是在 JDK 1.5 与注解(Annotation) 一起引入的,它是一个命令行工具,能够提供构建时基于源代码对程序结构的读取功能,能够通过运行注解处理器来生成新的中间文件,进而影响编译过程。
不过在JDK 1.8以后,第一种处理器被淘汰了,取而代之的是第二种处理器,我们一起看看它的处理流程:
Lombok的底层具体实现流程如下:
即使lombok
是一个神器,但是却有很多人不建议使用,这又是为什么呢?
这点确实比较恶心,因为如果使用lombok注解编写代码,就要求参与开发的所有人都必须安装idea的lombok插件,否则代码编译出错。
使用lombok注解之后,最后生成的代码你其实是看不到的,你能看到的是代码被修改之前的样子。如果要想查看某个getter或setter方法的引用过程,是非常困难的。
有人把JDK从Java 8升级到Java 11时,我发现Lombok不能正常工作了。
使用@Data时会默认使用@EqualsAndHashCode(callSuper=false),这时候生成的equals()方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放。
使用@Builder时要加上@AllArgsConstructor,否则可能会报错。
我们平时大部分人都喜欢用debug调试定位问题,但是使用lombok生成的代码不太好调试。
如果上游系统中提供的fegin client使用了lombok,那么下游系统必须也使用lombok,否则会报错,上下游系统构成了强依赖。
lombok有利有弊,我们该如何选择呢?
个人建议要结合项目的实际情况做最合理的选择。
如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描下发二维码关注一下,您的支持是我坚持写作最大的动力。
求一键三连:点赞、转发、在看。
本文由博客群发一文多发等运营工具平台 OpenWrite 发布