<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Lombok!代碼簡潔神器還是代碼“亞健康”元兇?

          共 11321字,需瀏覽 23分鐘

           ·

          2024-05-16 08:00

              
          點擊關(guān)注公眾號:互聯(lián)網(wǎng)架構(gòu)師,后臺回復 2T獲取2TB學習資源!

          上一篇:2T架構(gòu)師學習資料干貨分享

          大家好,我是互聯(lián)網(wǎng)架構(gòu)師!

          如果您正在閱讀此文,想必您對Project Lombok已經(jīng)有了一段時間的了解。您是否正準備擁抱Lombok?還是正準備將如此酷炫的項目推薦給你的團隊?如果您準備那么做,不妨聽聽我在使用Lombok一年后的一些感受。

          我承認,Lombok是一個很不錯的Java庫,它可以讓你在少寫代碼的同時耍耍酷,簡單的幾個注解,就可以干掉一大片模板代碼。但是,所有的源代碼很多時候是用來閱讀的,只有很少的時間是用來執(zhí)行的(你可以細品這句話)。

          一年以前,我和大多數(shù)人都認為Lombok的出現(xiàn)會讓Java的編碼體驗會更好,并極力的在我的團隊中推薦使用Lombok。一年以后,我開始對此產(chǎn)生顧慮,尤其是在我準備為開源的博客系統(tǒng)Una-Boot升級Java版本時,我才意識到Lombok自己掉入了一個戲法陷阱。在我進一步分析其源代碼并理解相關(guān)注解的工作原理后,發(fā)現(xiàn)我并不需要使用一個非標準的第三方庫將Java轉(zhuǎn)換為一個精巧而酷炫的語言。引入Lombok讓我的項目一時爽,但一時爽的代價是隨著項目推進,技術(shù)債務(wù)開始累積。

          接下來,我將用幾個大家耳熟能詳?shù)膱鼍埃匮葑约菏侨绾蔚羧隠ombok的戲法陷阱。

          愛的開始,恨的起源

          面對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就這點能耐?它還能讓你代碼的“身材”更苗條,更魔鬼。上面的代碼仍然還有改進的空間,我們可以用@EqualsAndHashCod注解替換到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+
                      "}";
              }
          }
          現(xiàn)在的代碼是否看起來爽多了?但這還不是最爽的時候。既然其他方法都替換掉了,那把toString方法也一起拿掉吧.如你所愿,可以使用@ToString注解去掉對于的方法:
          @Getter
          @Setter
          @EqualsAndHashCode
          @ToString
          public class MyObject{
              private Long id;
              private String name;
              private int age;
              private int gender;
          }
          經(jīng)過Lombok的戲法之后,相比一開始的代碼,看起來是不是很酷炫,很苗條,很性感?你以為到此為止了?遠不止于此。你會發(fā)現(xiàn)類名上一大坨注解看起來好別扭,Lombok提供了一個組合注解@Data,可以替換掉類名頭上那坨像翔一樣的東西:
          @Data
          public class MyObject{
              private Long id;
              private String name;
              private int age;
              private int gender;
          }
          現(xiàn)在,Lombok是否讓你的對象成為了你心目中完美的樣子?魔鬼的“身材”,酷炫精煉。Lombok還有其他一些注解,如@Slf4j,@NoArgsConstructor,@AllArgsConstructor等等,介紹Lombok用法不是本文重點。
          以上代碼行數(shù)的變化過程,也許是無數(shù)程序員愛上Lombok的主要原因吧,這就像一個肥胖的人逐漸變成一個身材苗條的人。同時也讓你看到了一個現(xiàn)象:你以為程序員很懶嗎?其他有些時候他們比你想象中的還要懶。在爽的同時,也為代碼種下了禍根。

          扭曲的審美,愛的隱患

          扭曲的審美,導致了被審視的對象出于亞健康狀態(tài)。使用Lombok插件之后,我們的代碼也處于“亞健康”狀態(tài)。還是回歸一開始的那句話:所有的源代碼很多時候是用來閱讀的,只有很少的時間是用來執(zhí)行的。
          本質(zhì)上講,我們都追求減少程序中的樣板代碼以使其代碼更精煉簡潔,從而提高代碼的可讀性和可維護性。但Lombok并沒有達到我們所追求的這一愿景,它僅僅是利用Java語言在編譯時的空檔期,使用一種很取巧的方式,將我們所需要的方法注入(寫入)到當前的類中,這種過程很像在hack我們的代碼,只是一種看起來酷炫的把戲。這種把戲并不智能和安全,反而會破壞Java代碼現(xiàn)有的特性以及代碼的可讀性。下面,結(jié)合我自己使用Lombok之后的感受,談?wù)凩ombok帶來的幾大痛點。

          1. JDK版本問題

          當我想要將現(xiàn)有項目的JDK從Java 8升級到Java 11時,我發(fā)現(xiàn)Lombok不能正常工作了。于是我不得不將所有的Lombok注解從項目源代碼中清除,并使用IDE自帶的功能生成getter/setter,equals,hashCode,toString以及構(gòu)造器等方法,你也可以使用Delombok工具完成這一過程。但這終究會消耗你很多的時間。

          2. 脅迫使用

          當你的源代碼中使用了Lombok,恰好你的代碼又被其他的人所使用,那么依賴你代碼的人,也必須安裝Lombok插件(不管他們喜不喜歡),同時還要花費時間去了解Lombok注解的使用情況,如果不那么做,代碼將無法正常運行。使用過Lombok之后,我發(fā)現(xiàn)這是一種很流氓的行為。

          3. 可讀性差

          Lombok隱藏了JavaBean封裝的細節(jié),如果你使用@AllArgsConstructor注解,它將提供一個巨型構(gòu)造器,讓外界有機會在初始化對象時修改類中所有的屬性。首先,這是極其不安全的,因為類中某系屬性我們是不希望被修改的;另外,如果某個類中有幾十個屬性存在,就會有一個包含幾十個參數(shù)的構(gòu)造器被Lombok注入到類中,這是不理智的行為;其次,構(gòu)造器參數(shù)的順序完全由Lombok所控制,我們并不能操控,只有當你需要調(diào)試時才發(fā)現(xiàn)有一個奇怪的“小強”在等著你;最后,在運行代碼之前,所有JavaBean中的方法你只能想象他們長什么樣子,你并不能看見。

          4. 代碼耦合度增加

          當你使用Lombok來編寫某一個模塊的代碼后,其余依賴此模塊的其他代碼都需要引入Lombok依賴,同時還需要在IDE中安裝Lombok的插件。雖然Lombok的依賴包并不大,但就因為其中一個地方使用了Lombok,其余所有的依賴方都要強制加入Lombok的Jar包,這是一種入侵式的耦合,如果再遇上JDK版本問題,這將是一場災(zāi)難。

          5. 得不償失

          使用Lombok,一時覺得很爽,但它卻污染了你的代碼,破壞了Java代碼的完整性,可讀性和安全性,同時還增加的團隊的技術(shù)債務(wù),這是一種弊大于利,得不償失的操作。如果你確實想讓自己的代碼更加精煉,同時又兼顧可讀性和編碼效率,不妨使用主流的Scala或Kotlin這一基于JVM的語言。

          總結(jié)

          Lombok本身是一個優(yōu)秀的Java代碼庫,它采用了一種取巧的語法糖,簡化了Java的編碼,為Java代碼的精簡提供了一種方式,但在使用此代碼庫時,需要了解到Lombok并非一個標準的Java庫。使用Lombok,會增加團隊的技術(shù)債務(wù),降低代碼的可讀性,增大代碼的耦合度和調(diào)式難度。雖然在一定程度上Lombok減少了樣板代碼的書寫,但也帶來了一些未知的風險。如果你正在參與一個團隊項目(或大型項目),考慮到后續(xù)的升級與擴展,是否使用Lombok,請與你的團隊多溝通和三思。

          作者:樹下魅狐
          來源:ramostear.com/blog/2020/04/28/uk1860p8.html



          最后,關(guān)注公眾號互聯(lián)網(wǎng)架構(gòu)師,在后臺回復:2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.JetBrains 如何看待自己的軟件在中國被頻繁破解?

          2.無意中發(fā)現(xiàn)了一位清華妹子的資料庫!

          3.程序員一般可以從什么平臺接私活?

          4.40歲,剛被裁,想說點啥。

          5.為什么國內(nèi) 996 干不過國外的 955呢?

          6.中國的鐵路訂票系統(tǒng)在世界上屬于什么水平?                        

          7.15張圖看懂瞎忙和高效的區(qū)別!

          瀏覽 89
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕一区免费 | 久久久久久欧美二区电影网 | 国女团被爆操视频 | 蜜臀久久99精品久久久久久宅男 | 99热在线播放 |