最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lombok中@Builder和@SuperBuilder注解的用法案例

 更新時間:2023年01月11日 08:48:00   作者:Twilight's?Blog  
@Builder?是?lombok?中的注解,可以使用builder()構(gòu)造的Person.PersonBuilder對象進(jìn)行鏈?zhǔn)秸{(diào)用,給所有屬性依次賦值,這篇文章主要介紹了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)

文檔中給了案例,在實體類上添加 @Builder 后,實體類會被改造成如下的結(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)變量的名稱是一個復(fù)數(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 設(shè)置默認(rèn)值,構(gòu)建對象時可以不用調(diào)用name()方法。(調(diào)用后會覆蓋默認(rèn)值)

@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) 可以使用已有的對象構(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ù)上放置一個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();

到此這篇關(guān)于Lombok中@Builder和@SuperBuilder注解的用法的文章就介紹到這了,更多相關(guān)Lombok中@Builder和@SuperBuilder注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java countDownLatch如何實現(xiàn)多線程任務(wù)阻塞等待

    Java countDownLatch如何實現(xiàn)多線程任務(wù)阻塞等待

    這篇文章主要介紹了Java countDownLatch如何實現(xiàn)多線程任務(wù)阻塞等待,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 全面解析Java設(shè)計模式之單例模式

    全面解析Java設(shè)計模式之單例模式

    這篇文章主要幫助大家全面解析Java設(shè)計模式之單例模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • mybatisplus如何實現(xiàn)排序

    mybatisplus如何實現(xiàn)排序

    這篇文章主要介紹了mybatisplus如何實現(xiàn)排序問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • RabbitMQ消息有效期與死信的處理過程

    RabbitMQ消息有效期與死信的處理過程

    利用DLX,當(dāng)消息在一個隊列中變成死信?(dead?message)?之后,它能被重新publish到另一個Exchange,這個Exchange就是DLX,本文重點給大家介紹RabbitMQ消息有效期與死信的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • 每日六道java新手入門面試題,通往自由的道路

    每日六道java新手入門面試題,通往自由的道路

    這篇文章主要為大家分享了最有價值的6道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對hashCode方法的設(shè)計、垃圾收集的堆和代進(jìn)行剖析,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 快速搭建SSM框架(Maven)五步曲的方法步驟

    快速搭建SSM框架(Maven)五步曲的方法步驟

    這篇文章主要介紹了快速搭建SSM框架(Maven)五步曲的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java RSA加密解密實現(xiàn)方法分析【附BASE64 jar包下載】

    Java RSA加密解密實現(xiàn)方法分析【附BASE64 jar包下載】

    這篇文章主要介紹了Java RSA加密解密實現(xiàn)方法,結(jié)合實例形式分析了java基于第三方類庫javabase64-1.3.1.jar實現(xiàn)RSA加密解密功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Java經(jīng)典算法匯總之選擇排序(SelectionSort)

    Java經(jīng)典算法匯總之選擇排序(SelectionSort)

    選擇排序也是比較簡單的一種排序方法,原理也比較容易理解,選擇排序在每次遍歷過程中只記錄下來最小的一個元素的下標(biāo),待全部比較結(jié)束之后,將最小的元素與未排序的那部分序列的最前面一個元素交換,這樣就降低了交換的次數(shù),提高了排序效率。
    2016-04-04
  • 解決程序包org.springframework.test.context不存在

    解決程序包org.springframework.test.context不存在

    這篇文章主要介紹了解決程序包org.springframework.test.context不存在的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • log4j2異步Logger(詳解)

    log4j2異步Logger(詳解)

    下面小編就為大家?guī)硪黄猯og4j2異步Logger(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論

罗田县| 水富县| 内乡县| 平塘县| 景谷| 江都市| 岑溪市| 中方县| 新密市| 徐州市| 阳高县| 岑溪市| 兴城市| 分宜县| 泊头市| 玉门市| 夏邑县| 松原市| 祁东县| 来凤县| 湄潭县| 白银市| 剑川县| 交城县| 都安| 逊克县| 启东市| 平顶山市| 丰宁| 高雄县| 织金县| 松滋市| 甘南县| 定边县| 遵义县| 通河县| 桑日县| 岳西县| 桃园市| 新兴县| 嘉定区|