轉載請註明出處:java
1. Lombok背景介紹maven
官方介紹以下:ide
Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.
大體意思是Lombok經過增長一些「處理程序」,可讓java變得簡潔、快速。ui
2.Lombok能以簡單的註解形式來簡化java代碼,提升開發人員的開發效率。例如開發中常常須要寫的javabean,都須要花時間去添加相應的getter/setter,也許還要去寫構造器、equals等方法,並且須要維護,當屬性多時會出現大量的getter/setter方法,這些顯得很冗長也沒有太多技術含量,一旦修改屬性,就容易出現忘記修改對應方法的失誤。
Lombok能經過註解的方式,在編譯時自動爲屬性生成構造器、getter/setter、equals、hashcode、toString方法。出現的神奇就是在源碼中沒有getter和setter方法,可是在編譯生成的字節碼文件中有getter和setter方法。這樣就省去了手動重建這些代碼的麻煩,使代碼看起來更簡潔些。
Lombok的使用跟引用jar包同樣,能夠在官網(https://projectlombok.org/download)下載jar包,也可使用maven添加依賴:this
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope> </dependency>
接下來咱們來分析Lombok中註解的具體用法。spa
2.1 @Data
@Data註解在類上,會爲類的全部屬性自動生成setter/getter、equals、canEqual、hashCode、toString方法,如爲final屬性,則不會爲該屬性生成setter方法。指針
import lombok.AccessLevel; import lombok.Setter; import lombok.Data; import lombok.ToString; @Data public class DataExample { private final String name; private int age; private double score; private String[] tags; @ToString(includeFieldNames=true) @Data(staticConstructor="of") public static class Exercise<T> { private final String name; private final T value; } }
2.2 @Getter/@Setter
若是以爲@Data太過殘暴(由於@Data集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor的全部特性)不夠精細,
可使用@Getter/@Setter註解,此註解在屬性上,能夠爲相應的屬性自動生成Getter/Setter方法,也能夠在類上,則自動對類屬性生成getter方法和setter方法。code
2.3 @NonNull
該註解用在屬性或構造器上,Lombok會生成一個非空的聲明,可用於校驗參數,能幫助避免空指針。
示例以下:blog
import lombok.NonNull; public class NonNullExample extends Something { private String name; public NonNullExample(@NonNull Person person) { super("Hello"); this.name = person.getName(); } }
2.4 @ToString
類使用@ToString註解,Lombok會生成一個toString()方法,默認狀況下,會輸出類名、全部屬性(會按照屬性定義順序),用逗號來分割。
經過將includeFieldNames參數設爲true,就能明確的輸出toString()屬性。這一點是否是有點繞口,經過代碼來看會更清晰些。
使用Lombok的示例:ip
import lombok.ToString; @ToString(exclude="id") public class ToStringExample { private static final int STATIC_VAR = 10; private String name; private Shape shape = new Square(5, 10); private String[] tags; private int id; public String getName() { return this.getName(); } @ToString(callSuper=true, includeFieldNames=true) public static class Square extends Shape { private final int width, height; public Square(int width, int height) { this.width = width; this.height = height; } } }
2.5 @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
無參構造器、部分參數構造器、全參構造器。Lombok無法實現多種參數構造器的重載。
Lombok示例代碼以下
import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.AllArgsConstructor; import lombok.NonNull; @RequiredArgsConstructor(staticName = "of") @AllArgsConstructor(access = AccessLevel.PROTECTED) public class ConstructorExample<T> { private int x, y; @NonNull private T description; @NoArgsConstructor public static class NoArgsExample { @NonNull private String field; } }
3. Lombok的優缺點 優勢: 1. 能經過註解的形式自動生成構造器、getter/setter、equals、hashcode、toString等方法,提升了必定的開發效率 2. 讓代碼變得簡潔,不用過多的去關注相應的方法 3. 屬性作修改時,也簡化了維護爲這些屬性所生成的getter/setter方法等 缺點: 1. 不支持多種參數構造器的重載 2. 雖然省去了手動建立getter/setter方法的麻煩,但大大下降了源代碼的可讀性和完整性,下降了閱讀源代碼的溫馨度