在創建對象實體類時,是不是還在爲set和get方法煩惱? 雖然可以通過快捷鍵生成get和set方法,但是如果對象實體類中的屬性比較多時,加上set和get方法,代碼會顯的很長,lombook插件可以幫我們進行簡化代碼。
lombok 提供了簡單的註解的形式來幫助我們簡化消除一些必須有但顯得很臃腫的 java 代碼。通過使用對應的註解,可以在編譯源碼的時候生成對應的方法,所以不會影響任何運行效率。
1、Lombook插件
1、maven項目lombook插件的依賴
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
Lombok只在編譯階段生效,不需要打入包中。可以將項目clean install後,在target目錄中查看到編譯的該類,該類中包含使用set和get註解帶有的代碼。
2、IDE添加對lombook插件的支持
以開發工具idea在線安裝爲例,安裝完插件後。
3、lombook註解
常用的 lombok 註解:
@Data :註解在類上;包含了@ToString,@EqualsAndHashCode,@Getter / @Setter和@RequiredArgsConstructor的功能,提供類所有屬性的 getter 和 setter 方法,此外還提供了equals、canEqual、hashCode、toString 方法
@Setter:註解在屬性上;爲屬性提供 setter 方法
@Getter:註解在屬性上;爲屬性提供 getter 方法
@ToString:註解在類上;生成toString()方法,默認情況下,它會按順序(以逗號分隔)打印你的類名稱以及每個字段。可以這樣設置不包含哪些字段@ToString(exclude = "id") / @ToString(exclude = {"id","name"})
如果繼承的有父類的話,可以設置callSuper 讓其調用父類的toString()方法,例如:@ToString(callSuper = true)
@EqualsAndHashCode:註解在類上;生成hashCode()和equals()方法,默認情況下,它將使用所有非靜態,非transient字段。但可以通過在可選的exclude參數中來排除更多字段。或者,通過在parameter參數中命名它們來準確指定希望使用哪些字段。
@NonNull: 註解在屬性上;標識屬性是不能爲空,爲空則拋出異常。
@Slf4j :註解在類上;根據用戶實際使用的日誌框架生成log日誌對象。
@Log4j :註解在類上;爲類提供一個 屬性名爲log 的 log4j 日誌對象
@NoArgsConstructor:註解在類上;爲類提供一個無參的構造方法。當類中有final字段沒有被初始化時,編譯器會報錯,此時可用@NoArgsConstructor(force = true),然後就會爲沒有初始化的final字段設置默認值 0 / false / null。對於具有約束的字段(例如@NonNull字段),不會生成檢查或分配,因此請注意,正確初始化這些字段之前,這些約束無效。
@AllArgsConstructor:註解在類上;爲類提供一個全參的構造方法
默認生成的方法是public的,如果要修改方法修飾符可以設置AccessLevel的值,例如:@Getter(access = AccessLevel.PROTECTED)
@RequiredArgsConstructor:註解在類上;會生成構造方法(可能帶參數也可能不帶參數),如果帶參數,這參數只能是以final修飾的未經初始化的字段,或者是以@NonNull註解的未經初始化的字段@RequiredArgsConstructor(staticName = "of")會生成一個of()的靜態方法,並把構造方法設置爲私有的。
4、常用註解
Getter和Setter註解,提供set和get方法。註解使用示例:
package com.code.study.example.entity;
import lombok.Getter;
import lombok.Setter;
/**
* @author: MWL
* @date: 2020/3/23 5:03 下午
**/
@Getter
@Setter
public class Student {
private String name;
private String userId;
private int top;
private float score;
private boolean isGraduate;
}
使用Getter和Setter註解,爲該類中的所有屬性生成set和get方法,我們可以在Structure視圖中,看到對應的方法(Mac鍵盤快捷鍵Command+7顯示該類Structure視圖),如下所示:
@ToString註解,作用於類,覆蓋默認的toString()方法,可以通過exclude屬性排除某些字段。
@Getter
@Setter
@ToString( exclude = {"score"})
public class Student {
private String name;
private String userId;
private int top;
private float score;
private boolean isGraduate;
}
//程序運行結果:Student(name=mwl, userId=sa323, top=1, isGraduate=false)
@NoArgsConstructor, @AllArgsConstructor: 作用於類上,用於生成無參和全參構造函數。
@Builder: 作用於類上,將類轉變爲建造者模式
@Log: 作用於類上,生成日誌變量,變量名爲log。
//log變量等同於以下代碼,和logger同樣效果,一般用於日誌打印:
private static final Logger logger = LoggerFactory.getLogger(Student.class);
package com.code.study.example.entity;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
/**
* @author: MWL
* @date: 2020/3/23 5:03 下午
**/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString( exclude = {"score"}) //沒有exclude屬性,默認打印對象全部屬性
@Slf4j
public class Student {
//使用@Slf4j註解後log與logger變量效果一樣 由於沒有引入相關依賴 下行代碼會報錯
private static final Logger logger = LoggerFactory.getLogger(Student.class);
private String name;
private String userId;
private int top;
private float score;
private boolean isGraduate;
private final String str = "Test";
public static void main(String[] args) {
Student stu = new Student();
stu.setName("mwl");
stu.setUserId("sa323");
stu.setTop(1);
stu.setScore(11.2F);
stu.setGraduate(false);
//排除isGraduate屬性 打印
System.out.println(stu.toString());
//包含全部參數的構造器
Student stu1 = new Student("a","b",12,23.f,false);
System.out.println(stu1.toString());
//建造者模式對對象屬性設值
Student stu2 = Student.builder()
.name("test")
.userId("idTest")
.top(22)
.score(9.9f)
.isGraduate(false)
.build();
System.out.println(stu2.toString());
}
}
順便再推薦一個插件,GenerateAllSetter,該插件作用是可以快速針對已有的model實體對象的屬性生產set代碼,免去開發者在開發過程中set屬性值時還需要去實體對象中翻查的時間,生成的同時會附帶類型默認值。新建一個對象,然後選中對象(在mac下使用快捷鍵 option+回車 可生成對象中的所有set語句,也可選擇)
代碼全部實例:
package com.code.study.example.entity;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
/**
* @author: MWL
* @date: 2020/3/23 5:03 下午
**/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString( exclude = {"score"}) //沒有exclude屬性,默認打印對象全部屬性
@Slf4j
public class Student {
//使用@Slf4j註解後log與logger變量效果一樣 由於沒有引入相關依賴 下行代碼會報錯
private static final Logger logger = LoggerFactory.getLogger(Student.class);
private String name;
private String userId;
private int top;
private float score;
private boolean isGraduate;
private final String str = "Test";
public static void main(String[] args) {
Student stu = new Student();
stu.setName("mwl");
stu.setUserId("sa323");
stu.setTop(1);
stu.setScore(11.2F);
stu.setGraduate(false);
//排除isGraduate屬性 打印
System.out.println(stu.toString());
//包含全部參數的構造器
Student stu1 = new Student("a","b",12,23.f,false);
System.out.println(stu1.toString());
//建造者模式對對象屬性設值
Student stu2 = Student.builder()
.name("test")
.userId("idTest")
.top(22)
.score(9.9f)
.isGraduate(false)
.build();
System.out.println(stu2.toString());
Student stu3 = new Student();
//選中對象(即選中Student),使用option+回車鍵 可生成如下代碼
stu3.setName("");
stu3.setUserId("");
stu3.setTop(0);
stu3.setScore(0.0F);
stu3.setGraduate(false);
}
}
rainbow brackets插件用於對括號標記不同顏色,防止代碼中缺少左右括號造成的困擾。