您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Lombok有什么好處,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
Lombok有什么好處?
Lombok是一款非常實(shí)用Java工具,可用來幫助開發(fā)人員消除Java的冗長(zhǎng)代碼,尤其是對(duì)于簡(jiǎn)單的Java對(duì)象(POJO)。它通過注釋實(shí)現(xiàn)這一目的。
如果大家對(duì)于Lombok比較了解的話,可以先跳過這一段,直接往后看,如果不是很熟悉的話,可以簡(jiǎn)單了解一下。
想在項(xiàng)目中使用Lombok,需要三個(gè)步驟:
一、IDE中安裝Lombok插件
目前Lombok支持多種IDE,其中包括主流的Eclips、Intellji IDEA、Myeclipse等都是支持的。
在IDEA中安裝方式如下:
二、導(dǎo)入相關(guān)依賴
Lombok 支持使用多重構(gòu)建工具進(jìn)行導(dǎo)入依賴,目前主要支持maven、gardle、ant等均支持。
如使用maven導(dǎo)入方式如下:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency>
三、代碼中使用注解
Lombok精簡(jiǎn)代碼的方式主要是通過注解來實(shí)現(xiàn),其中常用的有@Data、@Getter/@Setter、@Builder、@NonNull等。
如使用@Data注解,即可簡(jiǎn)單的定義一個(gè)Java Bean:
import lombok.Data; @Data public class Menu { private String shopId; private String skuMenuId; private String skuName; }
使用@Data注解在類上,相當(dāng)于同時(shí)使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor這些注解,對(duì)于POJO類十分有用。
即自動(dòng)幫忙給例子中的Menu類中定義了toString、Getter、Setter等方法。
通過上面的例子,大家可以發(fā)現(xiàn),我們使用@Data注解大大減少了代碼量,使代碼非常簡(jiǎn)潔。這也是很多開發(fā)者熱衷于使用Lombok的主要原因。
另外,關(guān)于Lombok的使用,不同人有不同的看法,因?yàn)楹芏嗳硕际褂眠^Lombok,對(duì)于他的優(yōu)點(diǎn)都比較了解,所以接下來我們重點(diǎn)說一下Lombok的使用會(huì)帶來哪些問題。
Lombok有什么壞處?
強(qiáng)X隊(duì)友
因?yàn)長(zhǎng)ombok的使用要求開發(fā)者一定要在IDE中安裝對(duì)應(yīng)的插件。
如果未安裝插件的話,使用IDE打開一個(gè)基于Lombok的項(xiàng)目的話會(huì)提示找不到方法等錯(cuò)誤。導(dǎo)致項(xiàng)目編譯失敗。
也就是說,如果項(xiàng)目組中有一個(gè)人使用了Lombok,那么其他人就必須也要安裝IDE插件。否則就沒辦法協(xié)同開發(fā)。
更重要的是,如果我們定義的一個(gè)jar包中使用了Lombok,那么就要求所有依賴這個(gè)jar包的所有應(yīng)用都必須安裝插件,這種侵入性是很高的。
代碼可讀性,可調(diào)試性低
在代碼中使用了Lombok,確實(shí)可以幫忙減少很多代碼,因?yàn)長(zhǎng)ombok會(huì)幫忙自動(dòng)生成很多代碼。
但是這些代碼是要在編譯階段才會(huì)生成的,所以在開發(fā)的過程中,其實(shí)很多代碼其實(shí)是缺失的。
在代碼中大量使用Lombok,就導(dǎo)致代碼的可讀性會(huì)低很多,而且也會(huì)給代碼調(diào)試帶來一定的問題。
比如,我們想要知道某個(gè)類中的某個(gè)屬性的getter方法都被哪些類引用的話,就沒那么簡(jiǎn)單了。
有坑
因?yàn)長(zhǎng)ombok使代碼開發(fā)非常簡(jiǎn)便,這就使得部分開發(fā)者對(duì)其產(chǎn)生過度依賴。
在使用Lombok過程中,如果對(duì)于各種注解的底層原理不理解的話,很容易產(chǎn)生意想不到的結(jié)果。
舉一個(gè)簡(jiǎn)單的例子,我們知道,當(dāng)我們使用@Data定義一個(gè)類的時(shí)候,會(huì)自動(dòng)幫我們生成equals()方法 。
但是如果只使用了@Data,而不使用@EqualsAndHashCode(callSuper=true)的話,會(huì)默認(rèn)是@EqualsAndHashCode(callSuper=false),這時(shí)候生成的equals()方法只會(huì)比較子類的屬性,不會(huì)考慮從父類繼承的屬性,無論父類屬性訪問權(quán)限是否開放。
這就可能得到意想不到的結(jié)果。
影響升級(jí)
因?yàn)長(zhǎng)ombok對(duì)于代碼有很強(qiáng)的侵入性,就可能帶來一個(gè)比較大的問題,那就是會(huì)影響我們對(duì)JDK的升級(jí)。
按照如今JDK的升級(jí)頻率,每半年都會(huì)推出一個(gè)新的版本,但是Lombok作為一個(gè)第三方工具,并且是由開源團(tuán)隊(duì)維護(hù)的,那么他的迭代速度是無法保證的。
所以,如果我們需要升級(jí)到某個(gè)新版本的JDK的時(shí)候,若其中的特性在Lombok中不支持的話就會(huì)受到影響。
還有一個(gè)可能帶來的問題,就是Lombok自身的升級(jí)也會(huì)受到限制。
因?yàn)橐粋€(gè)應(yīng)用可能依賴了多個(gè)jar包,而每個(gè)jar包可能又要依賴不同版本的Lombok,這就導(dǎo)致在應(yīng)用中需要做版本仲裁,而我們知道,jar包版本仲裁是沒那么容易的,而且發(fā)生問題的概率也很高。
破壞封裝性
以上幾個(gè)問題,我認(rèn)為都是有辦法可以避免的。但是有些人排斥使用Lombok還有一個(gè)重要的原因,那就是他會(huì)破壞封裝性。
眾所周知,Java的三大特性包括封裝性、繼承性和多態(tài)性。
如果我們?cè)诖a中直接使用Lombok,那么他會(huì)自動(dòng)幫我們生成getter、setter 等方法,這就意味著,一個(gè)類中的所有參數(shù)都自動(dòng)提供了設(shè)置和讀取方法。
舉個(gè)簡(jiǎn)單的例子,我們定義一個(gè)購(gòu)物車類:
@Data public class ShoppingCart { //商品數(shù)目 private int itemsCount; //總價(jià)格 private double totalPrice; //商品明細(xì) private List items = new ArrayList<>(); } //例子來源于《極客時(shí)間-設(shè)計(jì)模式之美》
我們知道,購(gòu)物車中商品數(shù)目、商品明細(xì)以及總價(jià)格三者之前其實(shí)是有關(guān)聯(lián)關(guān)系的,如果需要修改的話是要一起修改的。
但是,我們使用了Lombok的@Data注解,對(duì)于itemsCount 和 totalPrice這兩個(gè)屬性。雖然我們將它們定義成 private 類型,但是提供了 public 的 getter、setter 方法。
外部可以通過 setter 方法隨意地修改這兩個(gè)屬性的值。我們可以隨意調(diào)用 setter 方法,來重新設(shè)置 itemsCount、totalPrice 屬性的值,這也會(huì)導(dǎo)致其跟 items 屬性的值不一致。
而面向?qū)ο蠓庋b的定義是:通過訪問權(quán)限控制,隱藏內(nèi)部數(shù)據(jù),外部?jī)H能通過類提供的有限的接口訪問、修改內(nèi)部數(shù)據(jù)。所以,暴露不應(yīng)該暴露的 setter 方法,明顯違反了面向?qū)ο蟮姆庋b特性。
好的做法應(yīng)該是不提供getter/setter,而是只提供一個(gè)public的addItem方法,同時(shí)去修改itemsCount、totalPrice以及items三個(gè)屬性。
關(guān)于“Lombok有什么好處”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。