Lombok簡(jiǎn)介
Lombok
是一個(gè)可以通過(guò)簡(jiǎn)單的注解形式來(lái)幫助我們簡(jiǎn)化消除一些必須有但顯得很臃腫的Java代碼的工具矫夯,通過(guò)使用對(duì)應(yīng)的注解才菠,可以在編譯源碼的時(shí)候生成對(duì)應(yīng)的方法董朝。
簡(jiǎn)單來(lái)說(shuō),我們平時(shí)開(kāi)發(fā)過(guò)程中總是要花很多時(shí)間為Java Bean
去創(chuàng)建getter
和setter
方法斋否,當(dāng)類里面的屬性很多時(shí)則創(chuàng)建的getter
和setter
就很多谷羞,代碼就很長(zhǎng)。而lombok
就可以為我們省去創(chuàng)建getter
和setter
方法的麻煩,代碼也會(huì)更加簡(jiǎn)潔溶诞。
Lombok官方地址: https://projectlombok.org/
使用方法
一鸯檬、安裝插件
操作步驟:File
-> Settings...
-> Plugins
-> Browse repositories...
-> 輸入Lombok
搜索并安裝决侈,安裝完成后重啟IntelliJ IDEA。
二喧务、引用jar包
如果是使用Maven構(gòu)建項(xiàng)目赖歌,則添加以下依賴:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
</dependencies>
否則直接下載jar包并引入到項(xiàng)目中,下載地址為:下載Lombok
三功茴、lombok使用
lombok
的使用主要是通過(guò)注解方式庐冯,官網(wǎng)文檔lombok注解 有很詳細(xì)的說(shuō)明。
@@NonNull
@NonNull
為方法或構(gòu)造函數(shù)的參數(shù)生成null
檢查語(yǔ)句坎穿,相當(dāng)于if (param == null) throw new NullPointerException("param");
展父;生成的null
檢查語(yǔ)句會(huì)插入到方法的最前端返劲,如果是構(gòu)造函數(shù),則在this()
或super()
調(diào)用之后插入null
檢查栖茉。
使用lombok
,我們可以這樣寫:
import lombok.NonNull;
public class User extends BaseEntity {
private String name;
private String password;
public User(@NonNull Person person) {
super("Hello");
this.name = person.getName();
this.password = person.getPassword();
}
}
而不使用lombok
則是這樣寫:
import lombok.NonNull;
public class User extends BaseEntity {
private String name;
private String password;
public User(@NonNull Person person) {
super("Hello");
if (person == null) {
throw new NullPointerException("person");
}
this.name = person.getName();
this.password = person.getPassword();
}
}
@Getter
/@Setter
使用@Getter
/@Setter
給字段注解吕漂,lombok
會(huì)自動(dòng)生成默認(rèn)的getter
/setter
方法亲配,在Intellij IDEA的Structure
欄中可查看這個(gè)類的概要,就可以看到getter
和setter
方法已被添加到User
類中:
在未指定字段修飾符情況下惶凝,lombok
生成的getter
/setter
方法是public
的吼虎,若要修改其修飾符可設(shè)置AccessLevel
的值,如:
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
public class User {
private @Getter(AccessLevel.PRIVATE) @Setter String name;
private @Getter @Setter String password;
}
此時(shí)能看到User
類中的getName
方法的圖標(biāo)變成了一個(gè)鎖苍鲜,說(shuō)明getName
方法已經(jīng)是private
的思灰,將不會(huì)被公開(kāi):
@ToString
使用@ToString
會(huì)生成toString()
方法,它會(huì)按順序依次打印類名坡贺、字段官辈;若想忽略輸出字段,則可以用exclude
設(shè)置參數(shù)遍坟;如果有繼承父類拳亿,可以設(shè)置callSuper
為true
讓其調(diào)用父類toString()
方法:
@ToString(exclude = "password", callSuper = true)
public class User extends BaseEntity {
private @Getter @Setter String name;
private @Getter @Setter String password;
}
@EqualsAndHashCode
使用@EqualsAndHashCode
會(huì)生成hashCode()
和equals()
方法,默認(rèn)會(huì)使用所有非靜態(tài)愿伴、非transient
字段肺魁;
如果想排除某些字段可設(shè)置exclude
參數(shù);
如果有繼承父類隔节,可以設(shè)置callSuper
為true
讓其調(diào)用父類生成的equals()
和hashCode
方法鹅经,但是當(dāng)沒(méi)有繼承父類并設(shè)置callSuper
為true
時(shí)會(huì)在編譯時(shí)報(bào)錯(cuò):
import lombok.*;
@EqualsAndHashCode(exclude = "password")
public class User {
private @Getter @Setter String name;
private @Getter @Setter String password;
@EqualsAndHashCode(callSuper = true)
public static class Department extends BaseEntity {
private @Getter @Setter String departmentName;
}
}
在Intellij IDEA的Structure欄中可查看到有equals()
和hashCode()
方法:
@NoArgsConstructor
, @RequiredArgsConstructor
, @AllArgsConstructor
@NoArgsConstructor
生成一個(gè)無(wú)參數(shù)構(gòu)造函數(shù):
@RequiredArgsConstructor
生成構(gòu)造函數(shù);如果帶有參數(shù)怎诫,則該參數(shù)必須是以final
修飾并未初始化的字段或@NonNull
注解的并未初始化的字段瘾晃,參數(shù)的順序和字段在類中的聲明順序一致。
以@NonNull
注解并未初始化的:
以final
修飾并未初始化的:
正確和錯(cuò)誤示例:
@AllArgsConstructor
生成全參數(shù)構(gòu)造函數(shù)幻妓,將類中的每個(gè)字段生成帶有1個(gè)參數(shù)的構(gòu)造函數(shù)蹦误,例如有3個(gè)字段,則構(gòu)造函數(shù)的參數(shù)為3個(gè):
@Data
@Data
包含了@ToString
, @EqualsAndHashCode
, @Getter
, @Setter
, @RequiredArgsConstructor
的功能:
@Builder
@Builder
為類肉津、構(gòu)造器强胰、方法上生成復(fù)雜的構(gòu)建器API;構(gòu)造實(shí)例時(shí)妹沙,其屬性不再需要單獨(dú)set
偶洋,可以通過(guò)以下方式進(jìn)行實(shí)例化:
Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
其他注解
val
、@Cleanup
距糖、@SneakyThrows
玄窝、@Synchronized
牵寺、@Getter(lazy=true)
、@Log
恩脂、experimental
等就不再做介紹缸剪,用法和說(shuō)明可查看官網(wǎng)文檔https://projectlombok.org/features/all。
總結(jié)
使用lombok
能夠?yàn)槲覀兪∪ナ謩?dòng)創(chuàng)建getter
和setter
方法的麻煩东亦,lombok
有助于代碼的整潔杏节、效率的提高以及冗余的減少,但也同時(shí)降低了源代碼文件的可讀性和完整性典阵。
不可過(guò)度依賴lombok奋渔。