Java - 五分鐘學會Lombok 用法 - 古古's Blog

文章推薦指數: 80 %
投票人數:10人

Lombok 是一個Java library,可以透過簡單的注解省略Java 的code,像是setter、getter、logger…等,目的在消除冗長的code 和提高開發效率. Java-五分鐘學會Lombok用法 By古古 2020/03/04 Java Lombok是一個Javalibrary,可以透過簡單的注解省略Java的code,像是setter、getter、logger…等,目的在消除冗長的code和提高開發效率 假設你在類上加上了一個@Getter和@Setter注解,那你就不用在寫煩人的getter和setter,lombok會自動幫你產生出來啦! 之所以加個lombok的@Getter注解就可以幫我們自動生成所有變量的getter,是因為lombok參與了Java在compile階段生成.class檔的過程,lombok會幫我們自動寫一堆getter,然後塞進.class檔,所以真正被編譯出來的User.class檔案,是包含完整的getter的 簡單的說,lombok可以算是一種語法糖,只是在幫我們增進開發效率而已,實際上所產生出來的.class檔仍然是完全正常的 安裝Lombok 要在project中使用lombok,除了要在maven中加入lombokdependency,還要安裝Intellijlombok插件 1.加入mavendependency org.projectlombok lombok 1.18.18 2.在Intellij中安裝lombok插件 我使用的Intellij版本是2019.3.3,可能會因為版本差異導致安裝方式有改變 先點選左上角IntellijIDEA->Preferences 然後點擊左邊的Plugins,再點擊上面的Marketplacetab,然後就可以在搜尋欄中輸入lombok,並且找到lombok插件並安裝它 為什麼需要特地安裝Intellijlombok插件? 其實在maven加入lombokdependency之後,使用mvncleanpackage就可以正常build過,在Intellij中點擊綠色按鈕也可以運行程式 之所以還要特地安裝Intellijlombok插件,是因為如果不安裝lombok插件的話,Intellij就會沒辦法自動提示出lombok產生的方法,所以就會發生你的code一片紅,但是運行卻可以通過的奇妙現象 像是下面這段code中,因為對Intellij來說,code裡並不存在setter,所以沒辦法自動提示setId()、setName()等方法,但是又因為我們在maven中有加入lombokdependency,所以點擊第13行的綠色箭頭運行程式的話,是可以正常運行成功的 所以lombok算侵入性很高的一個library,只要團隊中有一個人用lombok開發,那麼所有的人都必須得安裝上lombok插件,才不會在Intellij中一打開project時,整片都是痛苦的紅字 Lombok用法 lombok官網提供了許多注解,但是「勁酒雖好,可不能貪杯」,你用了越多lombok的進階用法,會讓整個團隊的學習曲線上升,反而會造成反效果,所以在此處只解釋最最常見、並且我認為最必要的注解使用方式,其他的用法就不介紹了 1.@Getter/@Setter 自動產生getter/setter 2.@ToString 自動overridetoString()方法,會印出所有變量 3.@EqualsAndHashCode 自動生成equals(Objectother)和hashcode()方法,包括所有非靜態變量和非transient的變量 如果某些變量不想要加進判斷,可以透過exclude排除,也可以使用of指定某些字段 Q:為什麼只有一個整體的@EqualsAndHashCode注解,而不是分開的兩個@Equals和@HashCode? A:在Java中有規定,當兩個objectequals時,他們的hashcode一定要相同,反之,當hashcode相同時,object不一定equals。

所以equals和hashcode要一起implement,免得發生違反Java規定的情形發生 4.@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor 這三個很像,都是在自動生成該類的constructor,差別只在生成的constructor的參數不一樣而已 @NoArgsConstructor:生成一個沒有參數的constructor @AllArgsConstructor:生成一個包含所有參數的constructor 這裡注意一個Java的小坑,當我們沒有指定constructor時,Javacompiler會幫我們自動生成一個沒有任何參數的constructor給該類,但是如果我們自己寫了constructor之後,Java就不會自動幫我們補上那個無參數的constructor了 然而很多地方(像是SpringDataJPA),會需要每個類都一定要有一個無參數的constructor,所以你在加上@AllArgsConstructor時,拜託,一定要補上@NoArgsConstrcutor,不然會有各種坑等著你 @AllArgsConstructor @NoArgsConstructor publicclassUser{ privateIntegerid; privateStringname; } @RequiredArgsConstructor:生成一個包含“特定參數”的constructor,特定參數指的是那些有加上final修飾詞的變量們 補充一下,如果所有的變量都是正常的,都沒有用final修飾的話,那就會生成一個沒有參數的constructor 5.@Data 懶人包,只要加了@Data這個注解,等於同時加了以下注解 @Getter/@Setter @ToString @EqualsAndHashCode @RequiredArgsConstructor @Data是使用頻率最高的lombok注解,通常@Data會加在一個值可以被更新的Object上,像是日常使用的DTO們、或是JPA裡的Entity們,就很適合加上@Data注解,也就是@Dataformutableclass 6.@Value 也是懶人包,但是他會把所有的變量都設成final的,其他的就跟@Data一樣,等於同時加了以下注解 @Getter(注意沒有setter) @ToString @EqualsAndHashCode @RequiredArgsConstructor 上面那個@Data適合用在POJO或DTO上,而這個@Value注解,則是適合加在值不希望被改變的類上,像是某個類的值當創建後就不希望被更改,只希望我們讀它而已,就適合加上@Value注解,也就是@Valueforimmutableclass 另外注意一下,此lombok的注解@Value和另一個Spring的注解@Value撞名,在import時不要import錯了 7.@Builder 自動生成流式set值寫法,從此之後再也不用寫一堆setter了 注意,雖然只要加上@Builder注解,我們就能夠用流式寫法快速設定Object的值,但是setter還是必須要寫不能省略的,因為Spring或是其他框架有很多地方都會用到Object的getter/setter對他們取值/賦值 所以通常是@Data和@Builder會一起用在同個類上,既方便我們流式寫code,也方便框架做事 @Data @Builder publicclassUser{ privateIntegerid; privateStringname; } 8.@Slf4j 自動生成該類的log靜態常量,要打日誌就可以直接打,不用再手動newlog靜態常量了 除了@Slf4j之外,lombok也提供其他日誌框架的變種注解可以用,像是@Log、@Log4j…等,他們都是幫我們創建一個靜態常量log,只是使用的library不一樣而已 @Log//對應的log語句如下 privatestaticfinaljava.util.logging.Loggerlog=java.util.logging.Logger.getLogger(LogExample.class.getName()); @Log4j//對應的log語句如下 privatestaticfinalorg.apache.log4j.Loggerlog=org.apache.log4j.Logger.getLogger(LogExample.class); SpringBoot默認支持的就是slf4j+logback的日誌框架,所以也不用再多做啥設定,直接就可以用在SpringBootproject上,log系列注解最常用的就是@Slf4j



請為這篇文章評分?