我抵赖,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@Setterpublic 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@EqualsAndHashCodepublic 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@ToStringpublic class MyObject{ private Long id; private String name; private int age; private int gender;}
通过Lombok的戏法之后,相比一开始的代码,看起来是不是很酷炫,很苗条,很性感?你认为到此为止了?远不止于此。你会发现类名上一大坨注解看起来好顺当,Lombok提供了一个组合注解@Data,能够替换掉类名头上那坨像翔一样的货色:
@Datapublic 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/