Lombok中@Builder和@SuperBuilder注解的用法案例
Lombok中@Builder和@SuperBuilder注解的用法
@Builder
是 lombok
中的注解。可以使用builder()
構造的Person.PersonBuilder
對象進行鏈式調用,給所有屬性依次賦值。
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)
文檔中給了案例,在實體類上添加 @Builder
后,實體類會被改造成如下的結構:
Before: @Builder class Example<T> { private T foo; private final String bar; } After: class Example<T> { private T foo; private final String bar; // 私有的全參數(shù)構造函數(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 注解修飾集合
該注解默認變量的名稱是一個復數(shù),并且嘗試生成該變量的奇數(shù)形式。例如 List<String> skills
,會添加3個方法:
skill(String skill)
添加單個元素skills(List<String> skillList)
添加一個集合clearSkills()
清空集合,并且將未初始化的集合初始化未空集合。
如果無法計算得到變量名稱的奇數(shù)形式,則會提示報錯信息。用戶可以手動指定單數(shù)形式的方法名:
@Singular("skill") private List<String> skillList;
這時會生成skill(String skill)
、 skillList(List<String> skillList)
和 clearSkillList()
三個方法。
@Builder.Default
使用 @Builder.Default
設置默認值,構建對象時可以不用調用name()
方法。(調用后會覆蓋默認值)
@Builder.Default private String name = "zhangsan";
@SuperBuilder
@Builder
注解無法解析父類的屬性,而@SuperBuilder
可以讀取父類的屬性。使用時需要在子類和父類上都加上這個注解。
@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)
可以使用已有的對象構建新的對象,舊對象的屬性值會被保留和覆蓋。注意: 子類和父類都需要加上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將無法生成方法來設置Foo類中定義的參數(shù)值。
解決方法是:
- 手動創(chuàng)建Bar的構造函數(shù)。
- 在該構造函數(shù)上放置一個Builder注釋。
Lombok引入了實驗性功能,其版??本為: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();
到此這篇關于Lombok中@Builder和@SuperBuilder注解的用法的文章就介紹到這了,更多相關Lombok中@Builder和@SuperBuilder注解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用filebeat收集并解析springboot日志過程示例
這篇文章主要為大家介紹了使用filebeat收集并解析springboot日志實現(xiàn)過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08Java OpenSSL生成的RSA公私鑰進行數(shù)據加解密詳細介紹
這篇文章主要介紹了Java OpenSSL生成的RSA公私鑰進行數(shù)據加解密詳細介紹的相關資料,這里提供實例代碼及說明具體如何實現(xiàn),需要的朋友可以參考下2016-12-12Spring 單元測試中如何進行 mock的實現(xiàn)
這篇文章主要介紹了Spring 單元測試中如何進行 mock的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12Shiro實現(xiàn)session限制登錄數(shù)量踢人下線功能
這篇文章主要介紹了Shiro實現(xiàn)session限制登錄數(shù)量踢人下線,本文記錄的是shiro采用session作為登錄方案時,對用戶進行限制數(shù)量登錄,以及剔除下線,需要的朋友可以參考下2023-11-11