我抵赖,Lombok 是一个很不错的 Java 库,它能够让你在少写代码的同时耍耍酷,简略的几个注解,就能够干掉一大片模板代码。然而,所有的源代码很多时候是用来浏览的,只有很少的工夫是用来执行的 (你能够细品这句话)。
一年以前,我和大多数人都认为 Lombok 的呈现会让 Java 的编码体验会更好,并竭力的在我的团队中举荐应用 Lombok。一年当前,我开始对此产生顾虑,尤其是在我筹备为开源的博客零碎 Una-Boot 降级 Java 版本时,我才意识到 Lombok 本人掉入了一个戏法陷阱。在我进一步剖析其源代码并了解相干注解的工作原理后,发现我并不需要应用一个非标准的第三方库将 Java 转换为一个精美而酷炫的语言。引入 Lombok 让我的我的项目一时爽,但一时爽的代价是随着我的项目推动,技术债权开始累积。
接下来,我将用几个大家耳熟能详的场景,重演本人是如何掉入 Lombok 的戏法陷阱。
爱的开始,恨的起源
面对 Lombok 提供的诸多“神走位”,你并不会介意在 IDE 上新增一个插件。对于 IntelliJ IDEA 玩家而言,只需搜寻“Lombok Plugin”便可找到这款神器并装置上它。爱上 Lombok 从装置 Lombok 插件开始,恨也从此萌芽。
没应用 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+
"}";
}
}
每个 JavaBean 都会充斥着如上述 getter,setter,equals,hashCode 和 toString 的模板代码,这看起来像一个偏胖的人(不得不抵赖 Java 是一个有缺点的编程语言)。当咱们装置好 Lombok 插件后,IDE 便能够辨认其酷炫的注解,应用 Lombok 的 @Getter 和 @Setter 注解后,代码会像上面这样看起来很苗条:
@Getter
@Setter
public class MyObject{
private Long id;
private String name;
private int age;
private int 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 就这点能耐?它还能让你代码的“身材”更苗条,更魔鬼。下面的代码依然还有改良的空间,咱们能够用 @EqualsAndHashCode 注解替换到 equals 和 hashCode 办法:
@Getter
@Setter
@EqualsAndHashCode
public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
@Override
public String toString(){
return "MyObject{"+
"id="+id+
"name="+name+
"age="+age+
"gender="+gander+
"}";
}
}
当初的代码是否看起来爽多了?但这还不是最爽的时候。既然其余办法都替换掉了,那把 toString 办法也一起拿掉吧. 如你所愿,能够应用 @ToString 注解去掉对于的办法:
@Getter
@Setter
@EqualsAndHashCode
@ToString
public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
}
通过 Lombok 的戏法之后,相比一开始的代码,看起来是不是很酷炫,很苗条,很性感?你认为到此为止了?远不止于此。你会发现类名上一大坨注解看起来好顺当,Lombok 提供了一个组合注解 @Data,能够替换掉类名头上那坨像翔一样的货色:
@Data
public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
}
当初,Lombok 是否让你的对象成为了你心目中完满的样子? 魔鬼的“身材”,酷炫精炼。Lombok 还有其余一些注解,如 @Slf4j,@NoArgsConstructor,@AllArgsConstructor 等等,介绍 Lombok 用法不是本文重点。
以上代码行数的变动过程,兴许是有数程序员爱上 Lombok 的次要起因吧,这就像一个瘦削的人逐步变成一个身材苗条的人。同时也让你看到了一个景象:你认为程序员很懒吗?其余有些时候他们比你设想中的还要懒。在爽的同时,也为代码种下了祸根。
如果您正在学习 Spring Boot,举荐一个连载多年还在持续更新的收费教程:http://blog.didispace.com/spr…
扭曲的审美,爱的隐患
扭曲的审美,导致了被扫视的对象处于亚健康状态。应用 Lombok 插件之后,咱们的代码也处于“亚健康”状态。还是回归一开始的那句话:所有的源代码很多时候是用来浏览的,只有很少的工夫是用来执行的。
实质上讲,咱们都谋求缩小程序中的样板代码以使其代码更精炼简洁,从而进步代码的可读性和可维护性。但 Lombok 并没有达到咱们所谋求的这一愿景,它仅仅是利用 Java 语言在编译时的空档期,应用一种很取巧的形式,将咱们所须要的办法注入(写入)到以后的类中,这种过程很像在 hack 咱们的代码,只是一种看起来酷炫的花样。这种花样并不智能和平安,反而会毁坏 Java 代码现有的个性以及代码的可读性。上面,联合我本人应用 Lombok 之后的感触,谈谈 Lombok 带来的几大痛点。
1.JDK 版本问题
当我想要将现有我的项目的 JDK 从 Java 8 降级到 Java 11 时,我发现 Lombok 不能失常工作了。于是我不得不将所有的 Lombok 注解从我的项目源代码中革除,并应用 IDE 自带的性能生成 getter/setter,equals,hashCode,toString 以及结构器等办法,你也能够应用 Delombok 工具实现这一过程。但这终究会耗费你很多的工夫。
2. 胁迫应用
当你的源代码中应用了 Lombok,恰好你的代码又被其余的人所应用,那么依赖你代码的人,也必须装置 Lombok 插件(不论他们喜不喜欢),同时还要破费工夫去理解 Lombok 注解的应用状况,如果不那么做,代码将无奈失常运行。应用过 Lombok 之后,我发现这是一种很流氓的行为。
3. 可读性差
Lombok 暗藏了 JavaBean 封装的细节,如果你应用 @AllArgsConstructor 注解,它将提供一个巨型结构器,让外界有机会在初始化对象时批改类中所有的属性。首先,这是极其不平安的,因为类中某系属性咱们是不心愿被批改的;另外,如果某个类中有几十个属性存在,就会有一个蕴含几十个参数的结构器被 Lombok 注入到类中,这是不理智的行为;其次,结构器参数的程序齐全由 Lombok 所管制,咱们并不能操控,只有当你须要调试时才发现有一个奇怪的“小强”在等着你;最初,在运行代码之前,所有 JavaBean 中的办法你只能设想他们长什么样子,你并不能看见。
4. 代码耦合度减少
当你应用 Lombok 来编写某一个模块的代码后,其余依赖此模块的其余代码都须要引入 Lombok 依赖,同时还须要在 IDE 中装置 Lombok 的插件。尽管 Lombok 的依赖包并不大,但就因为其中一个中央应用了 Lombok,其余所有的依赖方都要强制退出 Lombok 的 Jar 包,这是一种入侵式的耦合,如果再遇上 JDK 版本问题,这将是一场劫难。
5. 得失相当
应用 Lombok,一时感觉很爽,但它却净化了你的代码,毁坏了 Java 代码的完整性,可读性和安全性,同时还减少的团队的技术债权,这是一种弊大于利,得失相当的操作。如果你的确想让本人的代码更加精炼,同时又兼顾可读性和编码效率,无妨应用支流的 Scala 或 Kotlin 这一基于 JVM 的语言。
总结
Lombok 自身是一个优良的 Java 代码库,它采纳了一种取巧的语法糖,简化了 Java 的编码,为 Java 代码的精简提供了一种形式,但在应用此代码库时,须要理解到 Lombok 并非一个规范的 Java 库。应用 Lombok,会减少团队的技术债权,升高代码的可读性,增大代码的耦合度和调式难度。尽管在肯定水平上 Lombok 缩小了样板代码的书写,但也带来了一些未知的危险。如果你正在参加一个团队我的项目(或大型项目), 思考到后续的降级与扩大,是否应用 Lombok,请与你的团队多沟通和三思。
那么,你感觉 Lombok 怎么样呢?是代码神器?还是亚健康首恶?留言说说你的认识吧!
本文转自: 程序猿 DD
内容转载自:toutiao.com/a6820517160964588044/