
前言
有的方法看看就好,知道可以這么用,但是否應(yīng)用到實(shí)際開(kāi)發(fā)中,那就仁者見(jiàn)仁,智者見(jiàn)智了。一萬(wàn)個(gè)讀者就會(huì)有一萬(wàn)個(gè)哈姆雷特,希望這篇文章能夠給您帶來(lái)一些思考。@onX
例如 onConstructor
, oMethod
, 和 onParam
允許你在生成的代碼中注入自定義的注解。一個(gè)常見(jiàn)的用例是結(jié)合 Spring 的 @Autowired
。在 Spring 的組件(如 @Service
、@Controller
、@Component
、@Repository
等)中使用 @RequiredArgsConstructor(onConstructor = @__(@Autowired))
,可以讓 Lombok 在生成構(gòu)造函數(shù)時(shí)也加上 @Autowired
注解,這樣,Spring 就可以自動(dòng)注入所需的依賴。@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class MyService {
private final AnotherService anotherService;
}
上述代碼片段使用 Lombok 和 Spring 注解,Lombok 會(huì)為其生成以下代碼@Service
public class MyService {
private final AnotherService anotherService;
@Autowired
public MyService(AnotherService anotherService) {
this.anotherService = anotherService;
}
}
- 為
MyService
生成了一個(gè)構(gòu)造函數(shù),該構(gòu)造函數(shù)接受一個(gè) AnotherService
類型的參數(shù)。 - 由于構(gòu)造函數(shù)上有
@Autowired
注解,Spring 會(huì)自動(dòng)查找合適的 AnotherService
bean 實(shí)例并注入到 MyService
中。
這種方式結(jié)合了 Lombok 的自動(dòng)代碼生成功能和 Spring 的依賴注入功能,使得代碼更為簡(jiǎn)潔。但是,使用此技巧時(shí)要確保團(tuán)隊(duì)成員都理解其背后的含義,以避免混淆。@Delegate
@Delegate
可以讓你的類使用其他類的方法,而不需要自己寫代碼。比如,你有一個(gè)類叫做A,它有一個(gè)方法叫做sayHello(),你想讓另一個(gè)類B也能用這個(gè)方法,那就可以在B類中加上一個(gè)A類型的字段,并在這個(gè)字段上加上@Delegate注解,這樣,B類就可以直接調(diào)用sayHello()方法,就像它是自己的方法一樣??磦€(gè)例子:// 一個(gè)類,有一個(gè)方法
public class A {
public void sayHello() {
System.out.println("Hello");
}
}
// 一個(gè)類,委托了A類的方法
public class B {
@Delegate // 委托A類的方法
private A a = new A();
public static void main(String[] args) {
B b = new B();
b.sayHello(); // 調(diào)用A類的方法
}
}
這樣寫最大的好處就是可以避免類的層次過(guò)深或者耦合過(guò)緊,提高代碼的可讀性和可維護(hù)性,各種繼承來(lái)繼承去是真的看得頭疼。@Cleanup
@Cleanup
可以自動(dòng)管理輸入輸出流等各種需要釋放的資源,確保安全地調(diào)用close方法。它的使用方法是在聲明的資源前加上@Cleanup
,例如:@Cleanup InputStream in = new FileInputStream("some/file");
這樣,當(dāng)你的代碼執(zhí)行完畢后,Lombok會(huì)自動(dòng)在一個(gè)try-finally塊中調(diào)用in.close()
方法,釋放資源。如果要釋放資源的方法名不是close,也可以指定要調(diào)用的方法名,例如:@Cleanup("release") MyResource resource = new MyResource();
Lombok會(huì)自動(dòng)在try-finally塊中調(diào)用resource.release()
方法,釋放資源。可以看到,這比手動(dòng)寫try-finally要簡(jiǎn)潔得太多了,只要使用@Cleanup
就能管理任何有無(wú)參方法的資源,指定正確的方法名即可。@Singular和 @Builder 組合
@Builder
讓你的類支持鏈?zhǔn)綐?gòu)造,而@Singular
讓集合類型字段可以更方便的維護(hù)。@Singular
注解可以用在集合類型的字段上,它會(huì)生成兩個(gè)方法,一個(gè)是添加單個(gè)元素的方法,一個(gè)是添加整個(gè)集合的方法。這兩個(gè)方法可以和 @Builder
生成的其他方法一起鏈?zhǔn)秸{(diào)用,給你的類的所有字段賦值。@Data
@Builder
public class User {
private String name;
private int age;
@Singular
private List<String> hobbies;
}
// 使用 @Builder 和 @Singular 生成的方法
User user = User.builder()
.name("練習(xí)時(shí)長(zhǎng)兩年半")
.age(28)
.hobby("籃球") // 添加單個(gè)元素
.hobby("唱歌") // 添加單個(gè)元素
.hobbies(Arrays.asList("跳舞", "其他")) // 添加整個(gè)集合
.build(); // 構(gòu)造 User 對(duì)象
可以看出,使用 @Singular
注解的好處是,你可以靈活地添加集合類型的字段,而不需要自己創(chuàng)建和初始化集合對(duì)象。另外,使用 @Singular
注解生成的集合字段,在調(diào)用 build()
方法后,會(huì)被轉(zhuǎn)換為不可變的集合,這樣可以保證對(duì)象的不變性和線程安全性。你也可以使用 clear()
方法來(lái)清空集合字段,例如:User user = User.builder()
.name("簽")
.age(28)
.hobby("說(shuō)唱")
.hobby("跳舞")
.clearHobbies() // 清空集合字段
.hobby("踩縫紉機(jī)") // 重新添加元素
.build();
但需要注意的是,如果你的類繼承了一個(gè)父類,那么 @Builder
只會(huì)生成當(dāng)前類的字段和參數(shù),不包括父類的。@With
允許你創(chuàng)建一個(gè)新的對(duì)象,該對(duì)象是當(dāng)前對(duì)象的副本,但某些字段的值已被更改。@With
public class Person {
private String name;
private int age;
}
Person person = new Person("Alice", 30);
// 創(chuàng)建一個(gè)新的 Person 對(duì)象,其 name 為 "Alice",但 age 為 31
Person updatedPerson = person.withAge(31);
結(jié)尾
請(qǐng)注意,盡管 Lombok 提供了許多方便的功能,但過(guò)度使用或不當(dāng)使用可能會(huì)導(dǎo)致代碼難以理解和維護(hù)。因此,在使用這些功能時(shí),務(wù)必始終保持審慎,并且要充分考慮其影響。
本文鏈接:http://fangxuan.com.cn/article/304.html