可以使用而且有著廣泛的使用,但是需要理解部分注解的底層和潛在問題,否則會(huì)有坑:
@Data: 如果只使用了@Data,而不使用@EqualsAndHashCode(callSuper=true)的話,會(huì)默認(rèn)是@EqualsAndHashCode(callSuper=false),這時(shí)候生成的equals()方法只會(huì)比較子類的屬性,不會(huì)考慮從父類繼承的屬性,無論父類屬性訪問權(quán)限是否開放。
代碼可讀性,可調(diào)試性低:在代碼中使用了Lombok,確實(shí)可以幫忙減少很多代碼,因?yàn)長(zhǎng)ombok會(huì)幫忙自動(dòng)生成很多代碼。但是這些代碼是要在編譯階段才會(huì)生成的,所以在開發(fā)的過程中,其實(shí)很多代碼其實(shí)是缺失的。
Lombok有很強(qiáng)的侵入性
如果項(xiàng)目組中有一個(gè)人使用了Lombok,那么其他人就必須也要安裝IDE插件。如果我們需要升級(jí)到某個(gè)新版本的JDK的時(shí)候,若其中的特性在Lombok中不支持的話就會(huì)受到影響
Lombok破壞了封裝性
舉個(gè)簡(jiǎn)單的例子,我們定義一個(gè)購(gòu)物車類:
我們知道,購(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è)屬性。(所以不能一股腦使用@Data注解)
此外,Java14 提供的record語法糖,來解決類似問題