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

java之lombok的構(gòu)建者模式Builder中的泛型寫法說明

 更新時間:2023年01月10日 09:10:16   作者:蒼穹之躍  
這篇文章主要介紹了java之lombok的構(gòu)建者模式Builder中的泛型寫法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

java lombok構(gòu)建者模式Builder的泛型寫法

第一步:編碼

?public static <T>AjaxResult<T> success(T data) {
? ? ? ? return AjaxResult.<T>builder()
? ? ? ? ? ? ? ? .code(SUCCESS_DEFAULT_CODE)
? ? ? ? ? ? ? ? .success(true)
? ? ? ? ? ? ? ? .msg(OK)
? ? ? ? ? ? ? ? .data(data)
? ? ? ? ? ? ? ? .build();
? ? }

第二步:使用:

? ? @ApiOperation(value = "查詢XXX")
? ? @PostMapping("/queryXXX")
? ? public AjaxResult<List<QueryXXXVo>> queryXXX() {
? ? ? ? return AjaxResult.success(XXXService.queryXXX());
? ? }

第三步:測試

請自行測試

lombok的@Builder注解帶來的兩大坑

1、@Data和@Builder導致無參構(gòu)造丟失

單獨使用@Data注解,是會生成無參數(shù)構(gòu)造方法。

單獨使用@Builder注解,發(fā)現(xiàn)生成了全屬性的構(gòu)造方法。

@Data和@Builder一起用:我們發(fā)現(xiàn)沒有了默認的構(gòu)造方法。如果手動添加無參數(shù)構(gòu)造方法或者用@NoArgsConstructor注解都會報錯!

兩種解決方法:

1、構(gòu)造方法加上@Tolerate 注解,讓lombok假裝它不存在(不感知)。

@Builder
@Data
public class TestLombok {

? ? @Tolerate
? ? TestLombok() {
? ? }
? ? ......
} ? ?

2、直接加上這4個注解

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TestLombok {
? ? ......
} ? ?

2、@Builder注解導致默認值無效

使用Lombok注解可以極高的簡化代碼量,比較好用的注解除了@Data之外,還有@Builder這個注解,它可以讓你很方便的使用builder模式構(gòu)建對象,但是今天發(fā)現(xiàn)@Builder注解會把對象的默認值清掉。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TestLombok {

? ? private String aa = "zzzz";

? ? public static void main(String[] args) {
? ? ? ? TestLombok build = TestLombok.builder().build();
? ? ? ? System.out.println(build);
? ? }
}

輸出:TestLombok(aa=null)

解決: 只需要在字段上面加上@Builder.Default注解即可

@Builder.Default
private String aa = "zzzz";

3、分析原因

我們使用注解的方式,底層本質(zhì)就是反射幫我們生成了一系列的setter、getter,所以我們直接打開編譯后的target包下面的.class文件,上面的所有原因一目了然!

源文件:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TestLombok {

? ? private String aa = "zzzz";

? ? public static void main(String[] args) {
? ? ? ? TestLombok build = TestLombok.builder().build();
? ? ? ? System.out.println(build);
? ? }
}

對應的class字節(jié)碼:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.apple.ucar;

public class TestLombok {
? ? private String aa = "zzzz";

? ? public static void main(String[] args) {
? ? ? ? TestLombok build = builder().build();
? ? ? ? System.out.println(build);
? ? }

? ? public static TestLombok.TestLombokBuilder builder() {
? ? ? ? return new TestLombok.TestLombokBuilder();
? ? }

? ? public String getAa() {
? ? ? ? return this.aa;
? ? }

? ? public void setAa(String aa) {
? ? ? ? this.aa = aa;
? ? }

? ? public boolean equals(Object o) {
? ? ? ? if (o == this) {
? ? ? ? ? ? return true;
? ? ? ? } else if (!(o instanceof TestLombok)) {
? ? ? ? ? ? return false;
? ? ? ? } else {
? ? ? ? ? ? TestLombok other = (TestLombok)o;
? ? ? ? ? ? if (!other.canEqual(this)) {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? Object this$aa = this.getAa();
? ? ? ? ? ? ? ? Object other$aa = other.getAa();
? ? ? ? ? ? ? ? if (this$aa == null) {
? ? ? ? ? ? ? ? ? ? if (other$aa != null) {
? ? ? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? } else if (!this$aa.equals(other$aa)) {
? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? }
? ? }

? ? protected boolean canEqual(Object other) {
? ? ? ? return other instanceof TestLombok;
? ? }

? ? public int hashCode() {
? ? ? ? int PRIME = true;
? ? ? ? int result = 1;
? ? ? ? Object $aa = this.getAa();
? ? ? ? int result = result * 59 + ($aa == null ? 43 : $aa.hashCode());
? ? ? ? return result;
? ? }

? ? public String toString() {
? ? ? ? return "TestLombok(aa=" + this.getAa() + ")";
? ? }

? ? public TestLombok() {
? ? }

? ? public TestLombok(String aa) {
? ? ? ? this.aa = aa;
? ? }

? ? public static class TestLombokBuilder {
? ? ? ? private String aa;

? ? ? ? TestLombokBuilder() {
? ? ? ? }

? ? ? ? public TestLombok.TestLombokBuilder aa(String aa) {
? ? ? ? ? ? this.aa = aa;
? ? ? ? ? ? return this;
? ? ? ? }

? ? ? ? public TestLombok build() {
? ? ? ? ? ? return new TestLombok(this.aa);
? ? ? ? }

? ? ? ? public String toString() {
? ? ? ? ? ? return "TestLombok.TestLombokBuilder(aa=" + this.aa + ")";
? ? ? ? }
? ? }
}

我們想知道@Data、@Builder等注解底層到底做了什么,直接編譯當前文件,即可在生成的.class字節(jié)碼文件查看具體代碼便知道了

比如上述第二點,采用@Builder的時候,這個aa并沒有默認值,所以會為空??!

? public TestLombok.TestLombokBuilder aa(String aa) {
? ? ? ? ? ? this.aa = aa;
? ? ? ? ? ? return this;
? ? ? ? }

小結(jié):個人覺得如果想要使用@Builder,最簡單的方法就是直接寫上這4個注解,有默認值的話再加上@Builder.Default直接,正常情況下就沒啥問題了!

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TestLombok {

?? ?@Builder.Default
? ? private String aa = "zzzz";

? ? public static void main(String[] args) {
? ? ? ? TestLombok build = TestLombok.builder().build();
? ? ? ? System.out.println(build);
? ? }
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring @Lookup深入分析實現(xiàn)原理

    Spring @Lookup深入分析實現(xiàn)原理

    這篇文章主要介紹了Spring @Lookup實現(xiàn)原理,我們知道在spring容器中單獨的一個抽象類是不能成為一個bean的,那么有沒有辦法呢?這個時候我們可以使用Lookup注解
    2023-01-01
  • Java?處理樹形結(jié)構(gòu)數(shù)據(jù)的過程

    Java?處理樹形結(jié)構(gòu)數(shù)據(jù)的過程

    這篇文章主要介紹了Java?處理樹形結(jié)構(gòu)數(shù)據(jù)的過程,本文給大家分析具體實現(xiàn)過程,結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • java 多態(tài)實例代碼

    java 多態(tài)實例代碼

    這篇文章主要介紹了java 多態(tài)實例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • java調(diào)用遠程服務器的shell腳本以及停止的方法實現(xiàn)

    java調(diào)用遠程服務器的shell腳本以及停止的方法實現(xiàn)

    這篇文章主要介紹了java調(diào)遠程服務器的shell腳本以及停止的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • OpenFeign指定url方式調(diào)用的方式詳解

    OpenFeign指定url方式調(diào)用的方式詳解

    OpenFeign一般是結(jié)合注冊中心一起使用的,也就是可以通過提供服務的名稱而不是url來完成對目標服務的訪問,本篇我們就講解一下OpenFeign直接通過目標服務的url進行調(diào)用的方式,需要的朋友可以參考下
    2024-11-11
  • Java基礎(chǔ)之反射

    Java基礎(chǔ)之反射

    JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;反射是框架設計的靈魂,感興趣的小伙伴可以參考閱讀
    2023-03-03
  • Java中Map.merge()方法使用示例詳解

    Java中Map.merge()方法使用示例詳解

    這篇文章主要介紹了Map.merge()方法使用和介紹,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Spring Boot啟動及退出加載項的方法

    Spring Boot啟動及退出加載項的方法

    這篇文章主要介紹了Spring Boot啟動及退出加載項的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Java設計模式之橋接模式

    Java設計模式之橋接模式

    這篇文章介紹了Java設計模式之橋接模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 解析Java并發(fā)Exchanger的使用

    解析Java并發(fā)Exchanger的使用

    Exchanger是java 5引入的并發(fā)類,Exchanger顧名思義就是用來做交換的。這里主要是兩個線程之間交換持有的對象。當Exchanger在一個線程中調(diào)用exchange方法之后,會等待另外的線程調(diào)用同樣的exchange方法。兩個線程都調(diào)用exchange方法之后,傳入的參數(shù)就會交換。
    2021-06-06

最新評論

称多县| 台东市| 郴州市| 新安县| 鲁山县| 成都市| 突泉县| 玉环县| 佳木斯市| 依兰县| 庆元县| 金华市| 绍兴市| 乌拉特后旗| 曲水县| 温宿县| 溧水县| 城固县| 陵水| 祁东县| 徐汇区| 朔州市| 菏泽市| 济阳县| 内黄县| 康定县| 谢通门县| 罗江县| 龙泉市| 大城县| 永德县| 澄城县| 达日县| 建阳市| 青海省| 盐池县| 湖南省| 雅江县| 筠连县| 上虞市| 图们市|