序言
各位好啊,我是會程式設計的蝸牛,作為java開發者,我們平常在開發過程中,總是希望能夠儘量少敲程式碼。這一方面,當然是為了偷懶,另一方面,當然也是為了程式碼看起來更加簡潔一點,不斷往程式設計規範上靠。然後其中有一個外掛或者說依賴吧,就是lombok,它的出現真可謂程式設計師的福音啊。只要用了這個東西,我們再也不用寫那一大堆重複的但確實必須的程式碼了。雖然我們也可以用IDEA自動生成這些東西,但總歸麻煩啊。一旦這個類的屬性做了一些調整,還得重新修改對應的setter/getter方法等。
當然,今天不是來說lombok的好的,而是想和各位探索一下這個東西存在的一些坑,防止大家踩坑,這個坑就讓我來踩一下吧~
問題再現
首先,我們新建一個Dog的類,裡面有name和year的屬性,然後加上註解@Data,然後進行編譯,可以看到class檔案裡面自動生成了很多程式碼。
裡面我數了一下,一共生成了6種型別的程式碼,有【空構造方法】、【Get/Set方法】、【equals方法】、【canEqual】、【hashCode】、【toString】方法,我們想要的和不想要的,通過給我們生成了。
事情到這裡本來是可以結束了,但是我們的java實在太博大精深了,區區這點註解,還不能完全生成所有的程式碼。
平常最常用的應該就是@Data註解了,但是其實還有好多其他的註解,比如@Builder,這是一個可以生成有參建構函式的註解,剛才生成的一般也能夠滿足我們的需求了,但是對於需要設定有參建構函式的情況,只用@Data就不夠了。
那我們看下使用@Builder,生成的程式碼是怎麼樣的。
可以看到,一共生成了3個大的程式碼,一個是有參建構函式,一個是靜態方法,一個是靜態類。
那麼,如果我們要使專案同時生成這些程式碼呢?大家可能會說,把兩個註解都加上唄。那麼,我們來試一下。
可以看到,雖然生成的程式碼有所增加,但少了一個關鍵的無參構造方法,這可是一個很關鍵的構造方法,在好的框架裡都會呼叫這個無參構造方法的。如果沒有,肯定會報一大堆錯誤的。
那麼,我們該怎麼做呢?
解決方法
然少了一個空構造方法,我們手動加一個。但結果卻出乎我們的意料,編譯報錯了。看來這種方式是不可行的。
然剛才那種方式不同,我們可以給剛才那個空構造方法,再加一個註解,這個註解是@Tolerate,有了這個註解,可以讓lombok在處理的時候,直接忽略這個構造方法,我們來看下效果。可以看到生成的class檔案裡面,已經有空構造方法了。
麼,還有其他的方式嗎?答案是肯定。我們可以使用@RequiredArgsConstructor 來構建含有引數的,用@NoArgsConstructor來構建沒有引數的,而捨棄@Builder。如圖,也同時生成了有參和無參的構造方法。
總結lombok雖然大大簡化了我們的開發,但還是得注意其中那些註解的問題,不然一不小心就容易掉進這種坑裡。可以多看看編譯出來的class檔案,這樣能更好的理解這個框架。
推薦閱讀 點選標題可跳轉