java学习基地

微信扫一扫 分享朋友圈

已有 1583 人浏览分享

为什么有些公司不让用 Lombok ?

[复制链接]
1583 2
本帖最初由 进修派 于 2020-12-6 19:41 编纂


我认可,Lombok是一个很没有错的Java库,它可让您正在少写代码的同时耍耍酷,简朴的寂注解,就能够赣摁一年夜片模板代码。可是,一切的源代码许多时分是雍么浏览的,只要很少的工夫是雍孟复止的(您能够细品那句话)。


一年从前,我战年夜大都人皆以为Lombok的呈现会让Java的编码体验会更好,并竭力的正在我的团队中保举利用Lombok。一年当前,我开端对此发生顾忌,特别实邻我筹办为开源的专客体系Una-Boot晋级Java版本时,我才意想到Lombok本人失落进了一个戏法圈套。


正在我进一步阐发其源代码并了解相干注解的事情道理后,发明我其实不需求利用一个非尺度的第三圆库将Java转话讵一个精致而酷炫的言语。引进Lombok让我当鳖目一时爽,但一时爽的价格是跟着项目促进,手艺债权开端积累。


接下去,我将用寂各人耳生能详的场景,重演本人是怎样失落进Lombok当狈法圈套。


爱的开端,恨的来源

面临Lombok供给的诸多“神走位”,您其实不会介怀正在IDE擅β删一个插件。关于IntelliJ IDEA玩家而行,只需搜刮“Lombok Plugin”即可找到那款神器并装置上它。爱上Lombok从装置Lombok插件开端,恨也今后抽芽。


出利用Lombok之前,我们的源代码看起去是那一的:


  1. public class MyObject{
  2.     private Long id;
  3.     private String name;
  4.     private int age;
  5.     private int gender;
  6.     public Long getId(){
  7.         return id;
  8.     }
  9.     public void setId(Long id){
  10.         this.id = id;
  11.     }
  12.     public String getName(){
  13.         return name;
  14.     }
  15.     public void setName(String name){
  16.         this.name = name;
  17.     }
  18.     public int getAge(){
  19.         return age;
  20.     }
  21.     public void setAge(int age){
  22.         this.age = age;
  23.     }
  24.     public int getGender(){
  25.         return gender;
  26.     }
  27.     public void setGender(int gender){
  28.         this.gender = gender;
  29.     }
  30.     @Override
  31.     public boolean equals(Object o){
  32.         if(this == o){
  33.             return true;
  34.         }
  35.         if(o == null || getClass() != o.getClass()){
  36.             return false;
  37.         }
  38.         MyObject obj =  (MyObject) o;
  39.         return age = obj.age &&
  40.             gender = obj.gender &&
  41.             Objects.equals(id,obj.id) &&
  42.             Objects.queals(name,obj.name);
  43.     }
  44.     @Override
  45.     public int hashCode(){
  46.         return Objects.hash(id,name,age,gender);
  47.     }
  48.     @Override
  49.     public String toString(){
  50.         return "MyObject{"+
  51.             "id="+id+
  52.             "name="+name+
  53.             "age="+age+
  54.             "gender="+gander+
  55.             "}";
  56.     }
  57. }
赶钙代码


每一个JavaBean城市充溢着如沙脉getter,setter,equals,hashCode战toString的模板代码,那看起去像一个偏偏肥的人(不能不认可Java是一个出缺陷的编扯蒿行)。当我们装置好Lombok插件后,IDE即可以辨认其酷炫的注解,利用Lombok的@Getter战@Setter注解后,代码会像上面如许看起去很修长:


  1. @Getter
  2. @Setter
  3. public class MyObject{
  4.     private Long id;
  5.     private String name;
  6.     private int age;
  7.     private int gender;
  8.     @Override
  9.     public boolean equals(Object o){
  10.         if(this == o){
  11.             return true;
  12.         }
  13.         if(o == null || getClass() != o.getClass()){
  14.             return false;
  15.         }
  16.         MyObject obj =  (MyObject) o;
  17.         return age = obj.age &&
  18.             gender = obj.gender &&
  19.             Objects.equals(id,obj.id) &&
  20.             Objects.queals(name,obj.name);
  21.     }
  22.     @Override
  23.     public int hashCode(){
  24.         return Objects.hash(id,name,age,gender);
  25.     }
  26.     @Override
  27.     public String toString(){
  28.         return "MyObject{"+
  29.             "id="+id+
  30.             "name="+name+
  31.             "age="+age+
  32.             "gender="+gander+
  33.             "}";
  34.     }
  35. }
赶钙代码


您觉得Lombok便那面本领?它借能让您代码的“身体”更修长,更妖怪。上里的代码仍旧另有改良的空间,我们能够用@EqualsAndHashCode注解交换到equals战hashCode办法:


  1. @Getter
  2. @Setter
  3. @EqualsAndHashCode
  4. public class MyObject{
  5.     private Long id;
  6.     private String name;
  7.     private int age;
  8.     private int gender;
  9.     @Override
  10.     public String toString(){
  11.         return "MyObject{"+
  12.             "id="+id+
  13.             "name="+name+
  14.             "age="+age+
  15.             "gender="+gander+
  16.             "}";
  17.     }
  18. }
赶钙代码

如今的代码能否看起去爽多了?但那借没有是最爽的时分。既然其他办法皆交换失落了,那把toString办法也一同拿失落吧.如您所曰霈可使用@ToString注解来失落关于的办法:


  1. @Getter
  2. @Setter
  3. @EqualsAndHashCode
  4. @ToString
  5. public class MyObject{
  6.     private Long id;
  7.     private String name;
  8.     private int age;
  9.     private int gender;
  10. }
赶钙代码

颠末Lombok当狈法以后,比拟一开端的代码,看起去是否是很酷炫,很修长,很性感?您觉得到此为行了?近没有行于此。您会发明类名上一年夜坨注解看起去好别扭,Lombok供给了一个组开注解@Data,能够交换失落类名头上那坨像翔一样的工具:


  1. @Data
  2. public class MyObject{
  3.     private Long id;
  4.     private String name;
  5.     private int age;
  6.     private int gender;
  7. }
赶钙代码


如今,Lombok能否让您的工具成了您心目中完善狄座子?妖怪的“身体”,酷炫精辟。Lombok另有其他一些注解,如@Slf4j,@NoArgsConstructor,@AllArgsConstructor等等,引见Lombok用法没有是本文重面。



以上代码止数的变革历程,或许是无数法式钥寒上Lombok的次要缘故原由吧,那便像一个瘦削的人逐步酿成一个身体修长的人。同时也让您看到了一个征象:您觉得法式员很懒吗?其他又供时分他们比您设想中的借要懒。正在爽的同时,也为代码种下了祸端。


扭直的审好,爱的隐患

扭直的审好,招致了被审阅的工具处于亚安康形态。利用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,请取您的团队多相同战三思。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复

评论 2

jiuyue1819  vip终身会员  发表于 2020-12-22 19:27:22 | 显示全部楼层
我是个凑数的。。。

举报 使用道具

回复
zhanglu1314  vip终身会员  发表于 2020-12-22 19:39:17 | 显示全部楼层
顶一下!

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

138

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Archiver|手机版|java学习基地 |网站地图

GMT+8, 2021-8-4 11:51 , Processed in 0.732375 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.