lombok安裝和使用
1,eclipse安裝lombok外掛參考:https://blog.csdn.net/dorothy1224/article/details/79280591/
2,IDEA安裝lombok外掛參考:https://blog.csdn.net/zhglance/article/details/54931430
3,新增lombok的maven的pom.xml依賴:
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>1.16.10</version>
- </dependency>
4,lombok的使用
1)重寫實體類的get,set,toString方法
- @Setter
- @Getter
- @ToString
- @EqualsAndHashCode
- publicclass Student {
- private String name;
- privateint age;
- private String male;
- private String studentNo;
- }
注意:@ToString(doNotUseGetters = true)通過向ToString註解新增doNotUseGetters 屬性可以使得重寫toString方法時,直接使用屬性和屬性值拼接
2)日誌使用
- @Slf4j
- publicclass UserController {
- public sayHello(){
- log.info("輸出日誌:{}",“日誌資訊”);
- }
- }
3)Lombok提供註解方式來提高程式碼的簡潔性,常用註解有:
- @Data : 註解在類上;包含了@ToString,@EqualsAndHashCode,@Getter / @Setter和@RequiredArgsConstructor的功能,提供類所有屬性的 getter 和 setter 方法,此外還提供了equals、canEqual、hashCode、toString 方法
- @Setter @Getter: 註解在屬性上;為屬性提供 getter setter 方法
- @NonNull:註解在屬性上;標識屬性是不能為空,為空則丟擲異常。
- @Synchronized : 加在方法上相當於在方法中新增同步塊。
- @ToString:註解在類上;生成toString()方法,預設情況下,它會按順序(以逗號分隔)列印你的類名稱以及每個欄位。可以這樣設定不包含哪些欄位@ToString(exclude = "id") / @ToString(exclude = {"id","name"})
- @EqualsAndHashCode:註解在類上;生成hashCode()和equals()方法,預設情況下,它將使用所有非靜態,非transient欄位。但可以通過在可選的exclude引數中來排除更多欄位。或者,通過在parameter引數中命名它們來準確指定希望使用哪些欄位。
- @Cleanup : 修飾流物件,就不用手動的關閉流物件了
- @SneakyThrows :用在方法上,如果不想try-catch異常,只想丟擲異常用@SneakyThrows註解
- @Slf4j : 註解在類上;根據使用者實際使用的日誌框架生成log日誌物件。
@NoArgsConstructor:註解在類上;為類提供一個無參的構造方法。當類中有final欄位沒有被初始化時,編譯器會報錯,此時可用@NoArgsConstructor(force = true),然後就會為沒有初始化的final欄位設定預設值 0 / false / null。對於具有約束的欄位(例如@NonNull欄位),不會生成檢查或分配,因此請注意,正確初始化這些欄位之前,這些約束無效。
@AllArgsConstructor:註解在類上;為類提供一個全參的構造方法
預設生成的方法是public的,如果要修改方法修飾符可以設定AccessLevel的值,例如:@Getter(access = AccessLevel.PROTECTED)
@RequiredArgsConstructor:註解在類上;會生成構造方法(可能帶引數也可能不帶引數),如果帶引數,這引數只能是以final修飾的未經初始化的欄位,或者是以@NonNull註解的未經初始化的欄位@RequiredArgsConstructor(staticName = "of")會生成一個of()的靜態方法,並把構造方法設定為私有的。
@Log4j :註解在類上;為類提供一個 屬性名為log 的 log4j 日誌物件
下面分別介紹每個方法的作用以及對應的原始碼 @Data
該註解相當於同時加上以下註解@Setter @Getter,@ToString,@EqualsAndHashCode,作用於類中 使用:
/**
* author: renpl
* blog: www.andyqian.com
*/
@Data
public class Person {
private String name;
private String address;
private String city;
private String state;
private String zip;
private Date brithday;
}
效果如下:
@[email protected]
作用於屬性上,自動生成get,set方法.
/**
* author:renpl
* blog: www.andyqian.com
*/
public class Person {
@Getter@Setter
private String name;
}
等價原始碼:
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@NonNull
該註解快速判斷是否為空,如果為空,則丟擲java.lang.NullPointerException
使用方法:
/**
* author: renpl
* blog: www.andyqian.com
*/
public class Person {
private String name;
@Setter@Getter@NonNull
private List<Person> member;
}
原始碼:
@NonNull
private List<Person> members;
public Family(@NonNull final List<Person> members) {
if (members == null) throw new java.lang.NullPointerException("members");
this.members = members;
}
@NonNull
public List<Person> getMembers() {
return members;
}
public void setMembers(@NonNull final List<Person> members) {
if (members == null) throw new java.lang.NullPointerException("members");
this.members = members;
}
@Synchronized
該註解自動新增到同步機制,有趣的是,生成的程式碼並不是直接鎖方法,而是鎖程式碼塊, 作用範圍是方法上
使用方法:
private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
@Synchronized
public String synchronizedFormat(Date date) {
return format.format(date);
}
生成等價原始碼:
private final java.lang.Object $lock = new java.lang.Object[0];
private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
public String synchronizedFormat(Date date) {
synchronized ($lock) {
return format.format(date);
}
}
@ToString
該方法大家應該非常熟悉,但需要注意的是:@ToString有多個屬性可以進一步設定:
- callSuper 是否輸出父類的toString方法,預設為false
- includeFieldNames 是否包含欄位名稱,預設為true
- exclude 排除生成tostring的欄位
使用方法:
/**
* author: renpl
* blog: www.andyqian.com
*/
@ToString(callSuper = true,exclude ={"name"})
public class Person {
private String name;
private String address;
}
等價原始碼:
public String toString() {
return "Person{" +
"address='" + address + '\'' +
'}';
}
@Cleanup
註釋可用於確保已分配的資源被釋放,如IO的連線關閉。
使用方法:
public void testCleanUp() {
try {
@Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(new byte[] {'Y','e','s'});
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
等價原始碼:
public void testCleanUp() {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
baos.write(new byte[]{'Y', 'e', 's'});
System.out.println(baos.toString());
} finally {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
參考:http://jnb.ociweb.com/jnb/jnbJan2010.html