迷茫了,我們到底該不該用lombok?

2021-01-07 馬家軍談Java

前言

最近上網查資料發現很多人對lombok褒貶不一,引起了我的興趣,因為我們項目中也在大量使用lombok,大家不同的觀點讓我也困惑了幾天,今天結合我實際的項目經驗,說說我的個人建議。

隨便搜搜就找到了這幾篇文章:

這些人建議使用 lombok,覺得它是一個神器,可以大大提高編碼效率,並且讓代碼更優雅。

在搜索的過程中,有些文章卻又不推薦使用:

這些人覺得它有一些坑,容易給項目埋下隱患,我們到底該聽誰的呢?

為什麼建議使用lombok?

1.傳統javabean

在沒使用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非常智能,可以把修改一次性搞定。

沒錯,但是有更優雅的處理方法。

2.lombok的使用

第一步,引入jar包

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> <scope>provided</scope> </dependency>第二步,在idea中安裝插件

注意:如果不按照插件idea中就無法編譯使用lombok註解的代碼。

第三步,在代碼中使用lombok註解

上面的User類代碼可以改成這樣:

@ToString@EqualsAndHashCode@NoArgsConstructor@AllArgsConstructor@Getter@Setterpublic class User { private Long id; private String name; private Integer age; private String address;}so good,代碼可以優化到如此簡單。User類的主體只用定義成員變量,其他的方法全都交給註解來完成。

如果修改了成員變量名稱或者類型,怎麼辦呢?

@ToString@EqualsAndHashCode@NoArgsConstructor@AllArgsConstructor@Getter@Setterpublic class User { private Long id; private String userName; private String age; private String address;}你只用一心一意修改成員變量即可,其他的根本不用操心,簡直太爽了。

更讓人興奮的是,還能進一步優化:

@NoArgsConstructor@AllArgsConstructor@Datapublic class User { private Long id; private String userName; private String age; private String address;}@Data相當於@Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor的集合。

lombok註解整理如下:

從上面看出使用lombok給人最大的感受是代碼量顯著減少了,能夠有效的提升開發效率,而代碼看起來更優雅,確實是一個不可多得的神器。

lombok工作原理

java程序的解析分為:運行時解析 和 編譯時解析。

通常我們通過反射獲取類、方法、註解和成員變量就是運行時解析。但是這種方式效率其實不高,要在程序運行起來才能解析。

這時候編譯時解析就體現出它的價值了。

編譯時解析又分為:註解處理器(Annotation Processing Tool)和 JSR 269 插入式註解處理器(Pluggable Annotation Processing API)

第一種處理器它最早是在 JDK 1.5 與註解(Annotation) 一起引入的,它是一個命令行工具,能夠提供構建時基於原始碼對程序結構的讀取功能,能夠通過運行註解處理器來生成新的中間文件,進而影響編譯過程。

不過在JDK 1.8以後,第一種處理器被淘汰了,取而代之的是第二種處理器,我們一起看看它的處理流程:

Lombok的底層具體實現流程如下:

javac對原始碼進行分析,生成了一棵抽象語法樹(AST)編譯過程中調用實現了「JSR 269 API」的Lombok程序此時Lombok就對第一步驟得到的AST進行處理,找到@Data註解所在類對應的語法樹(AST),然後修改該語法樹(AST),增加getter和setter方法定義的相應樹節點javac使用修改後的抽象語法樹(AST)生成字節碼文件,即給class增加新的節點(代碼塊)為什麼建議不用lombok?

即使lombok是一個神器,但是卻有很多人不建議使用,這又是為什麼呢?

1.強制要求隊友安裝idea插件

這點確實比較噁心,因為如果使用lombok註解編寫代碼,就要求參與開發的所有人都必須安裝idea的lombok插件,否則代碼編譯出錯。

2.代碼可讀性變差

使用lombok註解之後,最後生成的代碼你其實是看不到的,你能看到的是代碼被修改之前的樣子。如果要想查看某個getter或setter方法的引用過程,是非常困難的。

3.升級JDK對功能有影響

有人把JDK從Java 8升級到Java 11時,我發現Lombok不能正常工作了。

4.有一些坑

使用@Data時會默認使用@EqualsAndHashCode(callSuper=false),這時候生成的equals()方法只會比較子類的屬性,不會考慮從父類繼承的屬性,無論父類屬性訪問權限是否開放。使用@Builder時要加上@AllArgsConstructor,否則可能會報錯。5.不便於調試

我們平時大部分人都喜歡用debug調試定位問題,但是使用lombok生成的代碼不太好調試。

6.上下遊系統強依賴

如果上遊系統中提供的fegin client使用了lombok,那麼下遊系統必須也使用lombok,否則會報錯,上下遊系統構成了強依賴。

我們該如何選擇?

lombok有利有弊,我們該如何選擇呢?

個人建議要結合項目的實際情況做最合理的選擇。

如果你參與的是一個新項目,上下遊系統都是新的,這時候建議使用lombok,因為它可以顯著提升開發效率。如果你參與的是一個老項目,並且以前沒有使用過lombok,建議你後面也不要使用,因為代碼改造成本較高。如果以前使用過lombok,建議你後面也使用,因為代碼改造成本較高。其實只要引入jar包可能都有:強制要求隊友安裝idea插件、升級JDK對功能有影響、有一些坑 和 上下遊系統強依賴 這幾個問題,只要制定好規範,多總結使用經驗這些問題不大。代碼的可讀性變差 和 不便於調試 這兩個問題,我認為也不大,因為lombok一般被使用在javabean上,該類的邏輯相對來說比較簡單,很多代碼一眼就能看明白,即使不調試問題原因也能猜測7、8分。作者:蘇三說技術連結:https://juejin.cn/post/6909786009618087950

相關焦點

  • 我們到底該如何面對這個迷茫而混沌的時代
    尤其是,2020年新冠疫情的這一年裡,迷茫和混沌這兩個詞更是廣泛散布於成年人的世界裡。這也最讓我感慨的,我們的教育,從小到大的我們讀了那麼多的書,聽了那麼多的道理和報告!可是,我們依然沒有能夠過好我們的人生。不迷茫,不迷惑,我想,也只是少數人的專利吧!在校的學生,永遠都在為如何能夠拿到更高的分數而迷惑!那永遠做不完的試題,到底背後蘊含著什麼樣的秘訣呢?
  • java技能提升,用Lombok甩掉get和set,讓代碼變得更簡潔
    前言前幾天有個新來的同事(實習生)驚訝的對我說:我們的代碼裡好多錯誤,我的程序本地都啟動不了。我一臉懵逼的質問他:目前線上的代碼,怎麼會有問題嗎?Lombok通常我們代碼裡的實體Dao或者自定義Bean都會有get()和set()方法,set是設置的意思,而get是獲取的意思,顧名思義,這兩個方法是對數據進行設置和獲取用的。一般來說set和get方法都是對私有域變量進行操作的,所以大多數都是使用在包含特定屬性的類實體中。
  • 面對過得很充實,卻依然覺得很迷茫的窘境,我們該怎麼做呢?
    ①有人問迷茫是什麼?我想問有人知道自欺欺人的意思是什麼嗎?實際上,我們大多數人都不是哲學家,所以很難從本質上去解釋迷茫這個詞的深意。就我們常人而言,通俗的理解就是不知道做什麼,做了又覺得很空虛,仿佛就是在例行做著一件與自己不相關的事情,這就是迷茫的真實寫照。②那麼我為什麼會把迷茫和自欺欺人聯繫在一起呢?
  • 出國留學褒貶不一,很迷茫到底該不該出國留學,利弊點都在本文!
    卻忽略了一個至關重要的話題,就是到底該不該出國留學,出國留學到底有哪些好處,有哪些壞處。今天致叔圍繞著出國留學利與弊這個話題,結合多年來所遇見的學生給的一些列反饋來聊一聊,到底是留學是利大於弊,還是弊大於利。今天暫且不了留學國家的選擇,只針對出國留學到底應不應該,來深入的解析一下,讓各位迷茫中的朋友能夠更深刻的、更明白自己到底該不該留學。
  • 五分鐘學會 Java 開發效率神器 Lombok
    之所以加個 lombok 的 @Getter 註解就可以幫我們自動生成所有變量的 getter,是因為 lombok 參與了 Java 在 compile 階段生成 .class 檔的過程,lombok 會幫我們自動寫一堆 getter,然後塞進 .class 檔,所以真正被編譯出來的 User.class 檔桉,是包含完整的
  • 99%的程式設計師都在用Lombok,原理竟然這麼簡單?
    -- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12&
  • 人生感悟:「誰的青春不迷茫」,現代人很迷茫,不知所措該怎麼辦
    迷茫從字面解釋簡單的來說,「迷」就是模糊,不清楚,不明白。「茫」就是茫然,神情恍惚,通常指對未來的工作和生活方向感到不知所措。迷茫是一種必經的人生階段,誰的青春不迷茫,特別是現代人,處在信息化高速發展的今天,對當下不知所措對未來更是前途茫茫,不知道該怎麼辦。
  • 十分鐘搞懂Java效率工具Lombok使用與原理
    ;3 Lombok用法3.1 Lombok註解說明val:用在局部變量前面,相當於將變量聲明為final@NonNull:給方法參數增加這個註解會自動在方法內對該參數進行是否為空的校驗,如果為空,則拋出NPE(NullPointerException)@Cleanup:自動管理資源,用在局部變量之前,在當前變量範圍內即將執行完畢退出之前會自動清理資源
  • 面對職場迷茫,我們該如何走出迷茫,重新回歸自信呢?
    由於長時間找工作未果後,王曉有一些迷茫了,他一下子不知道自己該找什麼方向的工作了,他甚至有點不想上班了。但是不上班,他又沒有別的收入來源,自己還沒結婚,房子也沒買,以後他又如何去實現自己的夢想呢?其實,在我們的職場中,和王曉有著一樣處境的人是大有人在的。
  • 應屆畢業生找工作,迷茫時到底該怎麼辦!
    有許多剛步入社會的應屆生,我想他們在找工作方面一定會感到非常的迷茫,不知道自己該從事哪一行業的工作,從事那一類型的工作。其實應屆畢業生對走出校園步入社會即將接觸到的東西不熟悉,自然產生各種迷茫、害怕、畏懼;這也是正常的,但是關鍵是如何去面對它,順利地完成社會角色的轉換才是第一要務。如果只知道意味的害怕迷茫根部不可能找到工作,立足於社會的。其實剛開始出來工作的時候,我也經常受到迷茫的困擾。因為我感覺大學三年,好像什麼都沒有學過,莫名其妙的就畢業了。
  • 周杰倫迷茫時靠寫了一首歌堅持住了,我們迷茫時該怎麼辦呢?
    但是平凡的我們在經歷迷茫時,更多地是困惱自己的現狀。無聊刷短視頻的時候,看到一個觀眾在一個視頻下留言,人生迷茫,事業無成,婚姻受阻,有出頭之日否?一句話很短,卻道盡了很多人所面臨的所有痛苦,事業沒做成,想成家也成不了,不知道還有未來。
  • 我們的孩子到底該不該學英語?
    這場戰爭中也有哪種不和諧的聲音,一些所謂公知作家,說白就是洋奴,在疫情面前的表現與發聲具有極大的欺騙性。我們的孩子到底該不該學英語,我覺至少不應該在義務教育上作為必修課。我們的鄰國日本人是這樣評價中國人全民學英語:你們的問題出在教育上,打個比方:你們明明知道英語學一輩子也跟不上英國人,卻把考試把英語納入正科考試。
  • 健身腰帶到底該不該用!
    健身腰帶到底該不該用!     What’sup bro ,longtimenosee。我是TSN福鑫。今天我又開始更新文章了。
  • 安撫奶嘴,到底該不該用?
    安撫奶嘴,到底該不該用?但關於「安撫奶嘴到底該用還是不該用」這個問題,依然是眾說紛紜,爸爸媽媽們也不知道聽誰比較好。4、並不是每個寶寶都願意使用安撫奶嘴,如果寶寶實在是不喜歡安撫奶嘴也不要勉強。5、睡眠後若奶嘴脫出,沒必要再放回寶寶口腔。6、儘量選擇頸部薄且靈活的安撫奶嘴,能夠使寶寶嘴部自然閉合,從而減少牙齒咬合不齊的風險。7、為了寶寶的安全,不在安撫奶嘴上栓任何東西。
  • 誰的青春不迷茫,你在剛步入社會時有迷茫過嗎?迷茫狀態該怎麼做
    相信很多人都有這種感覺,在剛步入社會的時候,相信很多人都會有迷茫,焦慮,看不到對未來的任何信心。怕找的工作沒辦法適應、怕自己沒辦法受這份苦、害怕和別人交談,不知道自己該幹什麼工作,這份工作到底適不適合自己,各種各種問題。曾聽有人說過一句話是:寧做創業狼,不做打工狗。
  • 少兒美術,到底該不該用範畫?
    也就是說,當我們對這個世界了解更深,更豐富,我們的想像空間就會越廣泛,不被局限於小格局中。我們都知道孩子在繪畫時,需要有幾個方面來搭建:孩子的對世界的認知能力孩子的思維能力孩子的動手能力孩子的繪畫能力孩子對美學知識的掌握的廣度和深度孩子對美術的興趣和繪畫的自信心
  • 到底該不該給孩子用學步車?
    那麼到底該不該給寶寶使用學步車呢?家長們認為學步車可能帶來的便利和好處●為寶寶學走路提供了方便的工具;●使寶寶克服膽怯心理,成功獨立行走;●比寶寶扶桌腿或其他物品學走路更不易摔跤;●在某種程度上解放了家長(不必夾著、扶著、拉著寶寶學走路等)。
  • 現在大三,學的是心理學專業,很迷茫,該不該考研?
    現在大三,學的是心理學專業,感覺什麼也不懂,該不該考研?,這造就了很多人的尷尬,我想你是出於這個原因才問該不該考研。學姐明確的告訴你:如果感覺現在很迷茫,那就準備考研吧,起碼考上研究生後你的就業面更大,工資待遇更高,人際關係更廣,對自己的職業生涯更有好處,打個比方說,如果你本科就出去工作,3年後工資待遇可能就在5000元左右,若是你能考研,那麼畢業後進入外企工資待遇至少8000元以上,這就是差距,所以學姐建議你考研。
  • 99%的程式設計師都在用Lombok,原理竟然這麼簡單?我也手擼了一個!|建議收藏!!!
    對於 Lombok 我相信大部分人都不陌生,但對於它的實現原理以及缺點卻鮮為人知,而本文將會從 Lombok 的原理出發,手擼一個簡易版的 Lombok,讓你理解這個熱門技術背後的執行原理,以及它的優缺點。簡介 在講原理之前,我們先來複習一下 Lombok (老司機可直接跳過本段)。
  • 到底該不該給寶寶用安撫奶嘴?
    到底該不該給寶寶用安撫奶嘴?這是很多新手媽媽經常會遇到的問題。