Lombok中@Builder和@SuperBuilder注解的用法案例
Lombok中@Builder和@SuperBuilder注解的用法
@Builder 是 lombok 中的注解??梢允褂?code>builder()構(gòu)造的Person.PersonBuilder對象進(jìn)行鏈?zhǔn)秸{(diào)用,給所有屬性依次賦值。
Person person1 = Person.builder()
.name("張三")
.age(20)
.build();
System.out.println(person1); // Person(name=張三, age=20)
System.out.println(Person.builder()); // Person.PersonBuilder(name=null, age=null)文檔中給了案例,在實(shí)體類上添加 @Builder 后,實(shí)體類會被改造成如下的結(jié)構(gòu):
Before:
@Builder
class Example<T> {
private T foo;
private final String bar;
}
After:
class Example<T> {
private T foo;
private final String bar;
// 私有的全參數(shù)構(gòu)造函數(shù)
private Example(T foo, String bar) {
this.foo = foo;
this.bar = bar;
}
public static <T> ExampleBuilder<T> builder() {
return new ExampleBuilder<T>();
}
public static class ExampleBuilder<T> {
private T foo;
private String bar;
private ExampleBuilder() {}
public ExampleBuilder foo(T foo) {
this.foo = foo;
return this;
}
public ExampleBuilder bar(String bar) {
this.bar = bar;
return this;
}
@java.lang.Override public String toString() {
return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
}
public Example build() {
return new Example(foo, bar);
}
}
}
源碼如下:
@Target({TYPE, METHOD, CONSTRUCTOR})
@Retention(SOURCE)
public @interface Builder {
@Target(FIELD)
@Retention(SOURCE)
public @interface Default {}
String builderMethodName() default "builder";
String buildMethodName() default "build";
String builderClassName() default "";
boolean toBuilder() default false;
AccessLevel access() default lombok.AccessLevel.PUBLIC;
String setterPrefix() default "";
@Target({FIELD, PARAMETER})
@Retention(SOURCE)
public @interface ObtainVia {
String field() default "";
String method() default "";
boolean isStatic() default false;
}
}@Singular 注解修飾集合
該注解默認(rèn)變量的名稱是一個(gè)復(fù)數(shù),并且嘗試生成該變量的奇數(shù)形式。例如 List<String> skills,會添加3個(gè)方法:
skill(String skill)添加單個(gè)元素skills(List<String> skillList)添加一個(gè)集合clearSkills()清空集合,并且將未初始化的集合初始化未空集合。
如果無法計(jì)算得到變量名稱的奇數(shù)形式,則會提示報(bào)錯(cuò)信息。用戶可以手動指定單數(shù)形式的方法名:
@Singular("skill")
private List<String> skillList;這時(shí)會生成skill(String skill) 、 skillList(List<String> skillList) 和 clearSkillList()三個(gè)方法。
@Builder.Default
使用 @Builder.Default 設(shè)置默認(rèn)值,構(gòu)建對象時(shí)可以不用調(diào)用name()方法。(調(diào)用后會覆蓋默認(rèn)值)
@Builder.Default
private String name = "zhangsan";@SuperBuilder
@Builder 注解無法解析父類的屬性,而@SuperBuilder可以讀取父類的屬性。使用時(shí)需要在子類和父類上都加上這個(gè)注解。
@SuperBuilder
public class Male extends Person{
}
@SuperBuilder
public class Person {
@Builder.Default
private String name = "zhangsan";
private Integer age;
@Singular("skillList")
private List<String> skillList;
}@SuperBuilder(toBuilder=true)
使用 @SuperBuilder(toBuilder=true) 可以使用已有的對象構(gòu)建新的對象,舊對象的屬性值會被保留和覆蓋。注意: 子類和父類都需要加上toBuilder=true
Male man = Male.builder()
.name("張三")
.age(20)
.build();
Male man2 = man.toBuilder()
.age(30)
.build();PS:java Lombok下解決@Builder繼承解決方法(@SuperBuilder)
由于Lombok @Builder不適用于繼承用例:
class Foo{
protected int xyz1;
.....
protected String xyz7;
}
class Bar extends Foo{
}對于給定的用例,Lombok將無法生成方法來設(shè)置Foo類中定義的參數(shù)值。
解決方法是:
- 手動創(chuàng)建Bar的構(gòu)造函數(shù)。
- 在該構(gòu)造函數(shù)上放置一個(gè)Builder注釋。
Lombok引入了實(shí)驗(yàn)性功能,其版??本為:1.18.2,用于解決Builder注釋所面臨的繼承問題,并且可以使用@SuperBuilder注釋解決如下。
@SuperBuilder
public class ParentClass {
private final String a;
private final String b;
}
@SuperBuilder
public class ChildClass extends ParentClass{
private final String c;
}現(xiàn)在,可以使用如下所示的Builder類(使用@Builder注解是不可能的)
ChildClass.builder().a("testA").b("testB").c("testC").build();到此這篇關(guān)于Lombok中@Builder和@SuperBuilder注解的用法的文章就介紹到這了,更多相關(guān)Lombok中@Builder和@SuperBuilder注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用filebeat收集并解析springboot日志過程示例
這篇文章主要為大家介紹了使用filebeat收集并解析springboot日志實(shí)現(xiàn)過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
關(guān)于Spring AOP使用時(shí)的一些問題匯總
這篇文章主要給大家匯總介紹了關(guān)于Spring AOP使用時(shí)的一些問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Java OpenSSL生成的RSA公私鑰進(jìn)行數(shù)據(jù)加解密詳細(xì)介紹
這篇文章主要介紹了Java OpenSSL生成的RSA公私鑰進(jìn)行數(shù)據(jù)加解密詳細(xì)介紹的相關(guān)資料,這里提供實(shí)例代碼及說明具體如何實(shí)現(xiàn),需要的朋友可以參考下2016-12-12
Spring 單元測試中如何進(jìn)行 mock的實(shí)現(xiàn)
這篇文章主要介紹了Spring 單元測試中如何進(jìn)行 mock的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Shiro實(shí)現(xiàn)session限制登錄數(shù)量踢人下線功能
這篇文章主要介紹了Shiro實(shí)現(xiàn)session限制登錄數(shù)量踢人下線,本文記錄的是shiro采用session作為登錄方案時(shí),對用戶進(jìn)行限制數(shù)量登錄,以及剔除下線,需要的朋友可以參考下2023-11-11

