爲何要使用Lombok
我們在開發過程中,通常都會定義大量的JavaBean,然後通過IDE去生成其屬性的構造器、getter、setter、equals、hashcode、toString方法,當要增加屬性或者對某個屬性進行改變時,比如命名、類型等,都需要重新去生成上面提到的這些方法。這樣重複的勞動沒有任何意義,Lombok裏面的註解可以輕鬆解決這些問題。
Lombok簡介
Lombok是一個可以通過簡單的註解形式來幫助我們簡化消除一些必須有但顯得很臃腫的Java代碼的工具,通過使用對應的註解,可以在編譯源碼的時候生成對應的方法。官方地址:https://projectlombok.org/,github地址:https://github.com/rzwitserloot/lombok。
Lombok問題
無法支持多種參數構造器的重載
Lombok使用
1.添加maven依賴
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>1.16.6</version>
- </dependency>
2.idea中需要添加插件才能支持Lombok(IntelliJ Lombok plugin);
3.Lombok的使用,介紹了幾個常用的註解
@Getter / @Setter
可以作用在類上和屬性上,放在類上,會對所有的非靜態(non-static)屬性生成Getter/Setter方法,放在屬性上,會對該屬性生成Getter/Setter方法。並可以指定Getter/Setter方法的訪問級別。
@EqualsAndHashCode
默認情況下,會使用所有非瞬態(non-transient)和非靜態(non-static)字段來生成equals和hascode方法,也可以指定具體使用哪些屬性。
@ToString
生成toString方法,默認情況下,會輸出類名、所有屬性,屬性會按照順序輸出,以逗號分割。
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
無參構造器、部分參數構造器、全參構造器,當我們需要重載多個構造器的時候,Lombok就無能爲力了。
@Data:包含@ToString, @EqualsAndHashCode, 所有屬性的@Getter, 所有non-final屬性的@Setter和@RequiredArgsConstructor的組合,通常情況下,基本上使用這些註解就足夠了。
更多的請參見:https://projectlombok.org/features/index.html。
附錄:
Lombok註解
- @Data:註解在類上,將類提供的所有屬性都添加get、set方法,並添加、equals、canEquals、hashCode、toString方法
- @Setter:註解在類上,爲所有屬性添加set方法、註解在屬性上爲該屬性提供set方法
- @Getter:註解在類上,爲所有的屬性添加get方法、註解在屬性上爲該屬性提供get方法
- @NotNull:在參數中使用時,如果調用時傳了null值,就會拋出空指針異常
- @Synchronized 用於方法,可以鎖定指定的對象,如果不指定,則默認創建一個對象鎖定
- @Log作用於類,創建一個log屬性
- @Builder:使用builder模式創建對象
- @NoArgsConstructor:創建一個無參構造函數
- @AllArgsConstructor:創建一個全參構造函數
- @ToStirng:創建一個toString方法
- @Accessors(chain = true)使用鏈式設置屬性,set方法返回的是this對象。
- (鏈式設置屬性舉例:
- @RequiredArgsConstructor:創建對象
- @UtilityClass:工具類
- @ExtensionMethod:設置父類
- @FieldDefaults:設置屬性的使用範圍,如private、public等,也可以設置屬性是否被final修飾。
- @Cleanup: 關閉流、連接點。
- @EqualsAndHashCode:重寫equals和hashcode方法。
- @toString:創建toString方法。
一些使用的例子
普通的bean:
-
public class User {
private String id;
private String name;
private Integer age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
使用 lambok時
使用lombok,代碼可以變得非常的簡潔,看着也舒服。
-
@Setter
@Getter
public class User {
private String id;
private String name;
private Integer age;
}
public static void main(String[] args) {
User user = new User();
user.setId("1");
user.setName("name");
user.setAge(1);
}
@Accessors(chain = true):使用鏈式創建:
-
@Setter
@Getter
@Accessors(chain = true)
public class User {
private String id;
private String name;
private Integer age;
}
public static void main(String[] args) {
//使用@Accessors(chain = true)
User userChain = new User();
userChain.setId("1").setName("chain").setAge(1);
}
@Builder:使用builder模式創建對象
-
@Setter
@Getter
@Builder
public class User {
private String id;
private String name;
private Integer age;
}
public static void main(String[] args) {
User user = User.builder().id("1").name("builder").age(1).build();
System.out.println(user.getId());
}
@UtilityClass:工具類註解
-
@UtilityClass
public class Utility {
public String getName() {
return "name";
}
}
public static void main(String[] args) {
// Utility utility = new Utility(); 構造函數爲私有的,
System.out.println(Utility.getName());
}
轉自:https://blog.csdn.net/qq_33404395/article/details/80656654