我有個學(xué)弟,在一家小型互聯(lián)網(wǎng)公司做Java后端開發(fā),最近他們公司新來了一個技術(shù)總監(jiān),這位技術(shù)總監(jiān)對技術(shù)細節(jié)很看重,一來公司之后就推出了很多"政策",比如定義了很多開發(fā)規(guī)范、日志規(guī)范、甚至是要求大家統(tǒng)一使用某一款I(lǐng)DE。
但是這些都不是我這個學(xué)弟和我吐槽的點,他真正和我吐槽的是,他很不能理解,這位新來的技術(shù)總監(jiān)竟然禁止公司內(nèi)部所有開發(fā)使用Lombok。但是又沒給出十分明確的,可以讓人信服的理由。
于是他來找我聊天,問我這個要求到底是否合理。關(guān)于這個事情,我認為這位技術(shù)總監(jiān)的出發(fā)點是好的,但是做法未免有些極端。
之所以說出發(fā)點是好的,是因為使用Lombok確實會帶來很多問題,而且我個人在工作中也基本不主動使用。
之所以說不主動使用,那是因為有些同事的代碼還是使用了的,所以我也被迫的要安裝Lombok的插件。
既然聊到這個話題,就簡單說說我的一些看法。
Lombok有什么好處?Lombok是一款非常實用Java工具,可用來幫助開發(fā)人員消除Java的冗長代碼,尤其是對于簡單的Java對象(POJO)。它通過注釋實現(xiàn)這一目的。
如果大家對于Lombok比較了解的話,可以先跳過這一段,直接往后看,如果不是很熟悉的話,可以簡單了解一下。
想在項目中使用Lombok,需要三個步驟:
一、IDE中安裝Lombok插件
目前Lombok支持多種IDE,其中包括主流的Eclips、Intellji IDEA、Myeclipse等都是支持的。
在IDEA中安裝方式如下:
二、導(dǎo)入相關(guān)依賴
Lombok 支持使用多重構(gòu)建工具進行導(dǎo)入依賴,目前主要支持maven、gardle、ant等均支持。
如使用maven導(dǎo)入方式如下:
三、代碼中使用注解
Lombok精簡代碼的方式主要是通過注解來實現(xiàn),其中常用的有@Data、@Getter/@Setter、@Builder、@NonNull等。
如使用@Data注解,即可簡單的定義一個Java Bean:
即自動幫忙給例子中的Menu類中定義了toString、Getter、Setter等方法。
通過上面的例子,大家可以發(fā)現(xiàn),我們使用@Data注解大大減少了代碼量,使代碼非常簡潔。這也是很多開發(fā)者熱衷于使用Lombok的主要原因。
另外,關(guān)于Lombok的使用,不同人有不同的看法,因為很多人都使用過Lombok,對于他的優(yōu)點都比較了解,所以接下來我們重點說一下Lombok的使用會帶來哪些問題。
因為Lombok的使用要求開發(fā)者一定要在IDE中安裝對應(yīng)的插件。
如果未安裝插件的話,使用IDE打開一個基于Lombok的項目的話會提示找不到方法等錯誤。導(dǎo)致項目編譯失敗。
也就是說,如果項目組中有一個人使用了Lombok,那么其他人就必須也要安裝IDE插件。否則就沒辦法協(xié)同開發(fā)。
更重要的是,如果我們定義的一個jar包中使用了Lombok,那么就要求所有依賴這個jar包的所有應(yīng)用都必須安裝插件,這種侵入性是很高的。
代碼可讀性,可調(diào)試性低在代碼中使用了Lombok,確實可以幫忙減少很多代碼,因為Lombok會幫忙自動生成很多代碼。
但是這些代碼是要在編譯階段才會生成的,所以在開發(fā)的過程中,其實很多代碼其實是缺失的。
在代碼中大量使用Lombok,就導(dǎo)致代碼的可讀性會低很多,而且也會給代碼調(diào)試帶來一定的問題。
比如,我們想要知道某個類中的某個屬性的getter方法都被哪些類引用的話,就沒那么簡單了。
有坑因為Lombok使代碼開發(fā)非常簡便,這就使得部分開發(fā)者對其產(chǎn)生過度依賴。
在使用Lombok過程中,如果對于各種注解的底層原理不理解的話,很容易產(chǎn)生意想不到的結(jié)果。
舉一個簡單的例子,我們知道,當(dāng)我們使用@Data定義一個類的時候,會自動幫我們生成equals()方法 。
但是如果只使用了@Data,而不使用@EqualsAndHashCode(callSuper=true)的話,會默認是@EqualsAndHashCode(callSuper=false),這時候生成的equals()方法只會比較子類的屬性,不會考慮從父類繼承的屬性,無論父類屬性訪問權(quán)限是否開放。
這就可能得到意想不到的結(jié)果。
影響升級因為Lombok對于代碼有很強的侵入性,就可能帶來一個比較大的問題,那就是會影響我們對JDK的升級。
按照如今JDK的升級頻率,每半年都會推出一個新的版本,但是Lombok作為一個第三方工具,并且是由開源團隊維護的,那么他的迭代速度是無法保證的。
所以,如果我們需要升級到某個新版本的JDK的時候,若其中的特性在Lombok中不支持的話就會受到影響。
還有一個可能帶來的問題,就是Lombok自身的升級也會受到限制。
因為一個應(yīng)用可能依賴了多個jar包,而每個jar包可能又要依賴不同版本的Lombok,這就導(dǎo)致在應(yīng)用中需要做版本仲裁,而我們知道,jar包版本仲裁是沒那么容易的,而且發(fā)生問題的概率也很高。
破壞封裝性以上幾個問題,我認為都是有辦法可以避免的。但是有些人排斥使用Lombok還有一個重要的原因,那就是他會破壞封裝性。
眾所周知,Java的三大特性包括封裝性、繼承性和多態(tài)性。
如果我們在代碼中直接使用Lombok,那么他會自動幫我們生成getter、setter 等方法,這就意味著,一個類中的所有參數(shù)都自動提供了設(shè)置和讀取方法。
舉個簡單的例子,我們定義一個購物車類:
但是,我們使用了Lombok的@Data注解,對于itemsCount 和 totalPrice這兩個屬性。雖然我們將它們定義成 private 類型,但是提供了 public 的 getter、setter 方法。
外部可以通過 setter 方法隨意地修改這兩個屬性的值。我們可以隨意調(diào)用 setter 方法,來重新設(shè)置 itemsCount、totalPrice 屬性的值,這也會導(dǎo)致其跟 items 屬性的值不一致。
而面向?qū)ο蠓庋b的定義是:通過訪問權(quán)限控制,隱藏內(nèi)部數(shù)據(jù),外部僅能通過類提供的有限的接口訪問、修改內(nèi)部數(shù)據(jù)。所以,暴露不應(yīng)該暴露的 setter 方法,明顯違反了面向?qū)ο蟮姆庋b特性。
好的做法應(yīng)該是不提供getter/setter,而是只提供一個public的addItem方法,同時去修改itemsCount、totalPrice以及items三個屬性。
本文總結(jié)了常用的Java開發(fā)工具Lombok的優(yōu)缺點。
優(yōu)點是使用注解即可幫忙自動生成代碼,大大減少了代碼量,使代碼非常簡潔。
但是并不意味著Lombok的使用沒有任何問題,在使用Lombok的過程中,還可能存在對隊友不友好、對代碼不友好、對調(diào)試不友好、對升級不友好等問題。
最重要的是,使用Lombok還會導(dǎo)致破壞封裝性的問題。
雖然使用Lombok存在著很多方便,但是也帶來了一些問題。
但是到底建不建議在日常開發(fā)中使用,我其實保持一個中立的態(tài)度,不建議大家過度依賴,也不要求大家一定要徹底不用。
只要大家在使用的過程中,或者評估要不要在代碼中引入Lombok之前,在想到他的優(yōu)點的同時,能夠考慮到他給代碼帶來的問題的,那么本文的目的也就達到了!
來源:https://mp.weixin.qq.com/s/vSqaWHUjpPj4myPNFFtPYw
福利分享在這邊整理了一線互聯(lián)網(wǎng)企業(yè)的java學(xué)習(xí)文檔,可以免費的送給各位學(xué)習(xí)!
所有的復(fù)習(xí)資料都是可以免費的分享給有需要的小伙伴們的!如果你需要的話可以轉(zhuǎn)發(fā)文章后私信【復(fù)習(xí)】來免費獲取到。
01.Spring+Spring boot+SpringMVC 全面復(fù)習(xí)指南02.Dubbo+SpringCloud面試指南還有很多,都保存在WP里了,有需要的小伙伴可以私信我來獲取到,應(yīng)為我是截圖,所以圖片會有些不清楚,文檔不會有問題的,請大家伙放心!
關(guān)注作者加轉(zhuǎn)發(fā)文章后私信【復(fù)習(xí)】來免費獲取到上述的文檔資料哦!