天天看點

聊聊使用lombok @Builder踩到的坑

什麼是lombok

Lombok項目是一個Java庫,它會自動插入編輯器和建構工具中,Lombok提供了一組有用的注釋,用來消除Java類中的大量樣闆代碼。

對lombok不熟悉的朋友,可以閱讀一下官方文檔,再來看本文。官方文檔如下

https://projectlombok.org/

我們先來看一個小例子

聊聊使用lombok @Builder踩到的坑

提問: main函數會輸出什麼?

答案:空指針異常

回答出正确答案的朋友,下文基本上可以不用看了。可能有些朋友會有疑問,我例子中明明使用了

為什麼還會報空指針?

真相就在lombok用@builder生成的class檔案中,我們看下使用@builder,生成的class檔案反編譯後長啥樣

聊聊使用lombok @Builder踩到的坑

看到我圈紅起來的,大家應該就一目了然。原來當我們用

時,此時user對象中的positionList就會被userBuilder中的positionList覆寫,而userBuilder中的positionList是null

方法一:positionList前面加上final修飾

此時用@Budiler生成class為

此時user對象中的positionList用的還是原先的positionList,是以不會出現空指針異常

方法二:positionList前面加上@Builder.Default注解

當positionList$set為false,會給userBuilder的positionList指派為

是以當user對象中的positionList被userBuilder中的positionList覆寫後,userBuilder中的positionList是new ArrayList(),此時就不會出現空指針現象

方法三:不用build執行個體化對象

改成用

很多時候沒那麼多的想當然