蚌埠網(wǎng)站制作哪家好推廣資源網(wǎng)
目錄
- 前言
- 1. 基本知識(shí)
- 2. 代碼應(yīng)用
前言
在項(xiàng)目中經(jīng)常會(huì)看到lombok的應(yīng)用,此文作為科普帖,詳細(xì)介紹lombok
1. 基本知識(shí)
- Project Lombok是一款用于Java開(kāi)發(fā)的工具,旨在通過(guò)自動(dòng)生成樣板代碼來(lái)簡(jiǎn)化Java代碼的編寫(xiě)。
- 它通過(guò)注解(Annotation)的方式,幫助開(kāi)發(fā)人員自動(dòng)生成一些常見(jiàn)的Java代碼,如Getter、Setter、構(gòu)造函數(shù)等,從而減少樣板代碼的編寫(xiě),提高開(kāi)發(fā)效率。
- Lombok通過(guò)在Java源代碼中使用注解,實(shí)現(xiàn)了在編譯階段自動(dòng)生成代碼的功能。
- 當(dāng)開(kāi)發(fā)人員在類(lèi)或字段上使用Lombok提供的注解時(shí),Lombok在編譯源代碼時(shí)會(huì)通過(guò)插入AST(Abstract Syntax Tree)操作,在生成的Java字節(jié)碼中加入相應(yīng)的代碼。這樣,在運(yùn)行時(shí),代碼中就包含了通過(guò)注解生成的代碼,而開(kāi)發(fā)人員無(wú)需手動(dòng)編寫(xiě)這些冗長(zhǎng)的代碼。
簡(jiǎn)介:
工作原理:
其優(yōu)缺點(diǎn)如下:
優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|
1.簡(jiǎn)化代碼: Lombok通過(guò)自動(dòng)生成常見(jiàn)的樣板代碼,減少了開(kāi)發(fā)人員需要編寫(xiě)的代碼量,提高了代碼的簡(jiǎn)潔性。 2. 提高開(kāi)發(fā)效率: 通過(guò)自動(dòng)生成代碼,開(kāi)發(fā)人員能夠更專(zhuān)注于業(yè)務(wù)邏輯,減少了重復(fù)性勞動(dòng),提高了開(kāi)發(fā)效率。 3. 可讀性: 由于生成的代碼是標(biāo)準(zhǔn)的、一致的,提高了代碼的可讀性。 | 1.隱藏細(xì)節(jié): 自動(dòng)生成的代碼可能會(huì)隱藏一些細(xì)節(jié),開(kāi)發(fā)人員可能不太容易理解具體的實(shí)現(xiàn)方式。 2. 不適用于所有場(chǎng)景: Lombok適用于生成一些常見(jiàn)的代碼,但并不適用于所有的場(chǎng)景。在某些復(fù)雜的情況下,可能需要手動(dòng)編寫(xiě)代碼。 3. 工具依賴(lài): 開(kāi)發(fā)團(tuán)隊(duì)需要在開(kāi)發(fā)環(huán)境中安裝Lombok插件或者通過(guò)構(gòu)建工具配置來(lái)支持Lombok,這增加了項(xiàng)目的工具依賴(lài)。 |
2. 代碼應(yīng)用
再最新版的idea中都有自動(dòng)捆綁該插件,如果沒(méi)有無(wú)法使用lombok則在軟件中添加即可
先引入Maven文件中的依賴(lài):
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>>${lombok.version}</version><scope>provided</scope>
</dependency>
對(duì)于lombok的注解,主要有如下:
- @Setter 和 @Getter
import lombok.Getter;
import lombok.Setter;public class MyClass {@Getter@Setterprivate String name;
}
等價(jià)于:
public class MyClass {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}
- @AllArgsConstructor
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;@NoArgsConstructor
@AllArgsConstructor
public class MyClass {private String name;private int age;
}
等價(jià)于:
public class MyClass {private String name;private int age;public MyClass() {// 無(wú)參構(gòu)造方法}public MyClass(String name, int age) {// 有參構(gòu)造方法this.name = name;this.age = age;}
}
-
@NoArgsConstructor :該注解使用在類(lèi)上,提供無(wú)參構(gòu)造
-
@Data :(包含了@Getter、@Setter、@ToString、@EqualsAndHashCode和@AllArgsConstructor的功能)
需要注意的是:同時(shí)使用 @Data 和 @AllArgsConstructor 后 ,默認(rèn)的無(wú)參構(gòu)造函數(shù)失效,如果需要它,要重新設(shè)置 @NoArgsConstructor
import lombok.Data;@Data
public class MyClass {private String name;private int age;
}
- @Log(這是一個(gè)泛型注解,具體有很多種形式):@Slf4j :在類(lèi)上注解后,可直接調(diào)用log
log.info(xxxx);
-
@ToString :該注解使用在類(lèi)上,編譯后toString方法返回將會(huì)以字段的名稱(chēng)-值的形式輸出
-
@EqualsAndHashCode :該注解使用在類(lèi)上,同時(shí)生成 equals 和 hashCode 。
-
@NonNull :增加不為空判斷
public NonNullExample(@NonNull Person person) {this.name = person.getName();
}
轉(zhuǎn)換為:
public NonNullExample(@NonNull Person person) {if (person == null) {throw new NullPointerException("person");}this.name = person.getName();
}
- @Cleanup:自動(dòng)化關(guān)閉流,相當(dāng)于 try with resource
@Cleanup
InputStream in = new FileInputStream(args[0]);
@Cleanup
OutputStream out = new FileOutputStream(args[1]);
- @SneakyThrows :當(dāng)我們需要拋出異常,在當(dāng)前方法上調(diào)用,不用顯示的在方法名后面寫(xiě) throw
@SneakyThrows(Exception.class)
- @Synchronized :方法中所有的代碼都加入到一個(gè)代碼塊中,默認(rèn)靜態(tài)方法使用的是全局鎖,普通方法使
用的是對(duì)象鎖,當(dāng)然也可以指定鎖的對(duì)象。
private final Object lock = new Object();@Synchronized("lock")public void foo() {// Do something}