亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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());
? ? }

第三步:測(cè)試

請(qǐng)自行測(cè)試

lombok的@Builder注解帶來(lái)的兩大坑

1、@Data和@Builder導(dǎo)致無(wú)參構(gòu)造丟失

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

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

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

兩種解決方法:

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

@Builder
@Data
public class TestLombok {

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

2、直接加上這4個(gè)注解

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

2、@Builder注解導(dǎo)致默認(rèn)值無(wú)效

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

@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);
? ? }
}

對(duì)應(yīng)的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等注解底層到底做了什么,直接編譯當(dāng)前文件,即可在生成的.class字節(jié)碼文件查看具體代碼便知道了

比如上述第二點(diǎn),采用@Builder的時(shí)候,這個(gè)aa并沒有默認(rèn)值,所以會(huì)為空??!

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

小結(jié):個(gè)人覺得如果想要使用@Builder,最簡(jiǎn)單的方法就是直接寫上這4個(gè)注解,有默認(rèn)值的話再加上@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é)

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

相關(guān)文章

  • Spring Boot Test詳解

    Spring Boot Test詳解

    Spring Test與JUnit等其他測(cè)試框架結(jié)合起來(lái),提供了便捷高效的測(cè)試手段,而Spring Boot Test 是在Spring Test之上的再次封裝,增加了切片測(cè)試,增強(qiáng)了mock能力,這篇文章主要介紹了Spring Boot Test介紹,需要的朋友可以參考下
    2024-02-02
  • JPA?CriteriaBuilder子查詢方式

    JPA?CriteriaBuilder子查詢方式

    這篇文章主要介紹了JPA?CriteriaBuilder子查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 實(shí)例詳解Java中ThreadLocal內(nèi)存泄露

    實(shí)例詳解Java中ThreadLocal內(nèi)存泄露

    這一篇文章我們來(lái)分析一個(gè)Java中ThreadLocal內(nèi)存泄露的案例。分析問題的過(guò)程比結(jié)果更重要,理論結(jié)合實(shí)際才能徹底分析出內(nèi)存泄漏的原因。
    2016-08-08
  • IntelliJ IDEA里找不到j(luò)avax.servlet的jar包的解決方法

    IntelliJ IDEA里找不到j(luò)avax.servlet的jar包的解決方法

    這篇文章主要介紹了IntelliJ IDEA里找不到j(luò)avax.servlet的jar包的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • mybatis-plus之自動(dòng)映射字段(typeHandler)的注意點(diǎn)及說(shuō)明

    mybatis-plus之自動(dòng)映射字段(typeHandler)的注意點(diǎn)及說(shuō)明

    這篇文章主要介紹了mybatis-plus之自動(dòng)映射字段(typeHandler)的注意點(diǎn)及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java實(shí)現(xiàn)的迷宮游戲

    Java實(shí)現(xiàn)的迷宮游戲

    這篇文章主要介紹了如何用Java實(shí)現(xiàn)一個(gè)迷宮游戲,本倉(cāng)庫(kù)代碼是經(jīng)過(guò)eclipse編譯運(yùn)行過(guò)的,一般情況下將本倉(cāng)庫(kù)代碼下載下來(lái)之后,使用eclipse編譯直接可以運(yùn)行。
    2021-04-04
  • Java中StringBuilder類的用法解析

    Java中StringBuilder類的用法解析

    StringBuilder是一個(gè)可變的字符序列,這個(gè)類提供了一個(gè)與StringBuffer兼容的API。本文主要為大家介紹了StringBuilder類的常用用法,需要的可以參考一下
    2023-05-05
  • 在SpringBoot中配置日期格式化的方法詳解

    在SpringBoot中配置日期格式化的方法詳解

    通常情況下,發(fā)起一個(gè) Http 請(qǐng)求,Spring Boot 會(huì)根據(jù)請(qǐng)求路徑映射到指定 Controller 上的某個(gè)方法的參數(shù)上,接著,Spring 會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換,對(duì)于日期類型的參數(shù),Spring 默認(rèn)是沒有配置如何將字符串轉(zhuǎn)換成日期類型的,本文將給大家介紹在SpringBoot中配置日期格式化的方法
    2023-10-10
  • Java函數(shù)式編程(六):Optional

    Java函數(shù)式編程(六):Optional

    這篇文章主要介紹了Java函數(shù)式編程(六):Optional,本文是系列文章的第6篇,其它文章請(qǐng)參閱本文底部的相關(guān)文章,需要的朋友可以參考下
    2014-09-09
  • Java java.lang.InstantiationException異常案例詳解

    Java java.lang.InstantiationException異常案例詳解

    這篇文章主要介紹了Java java.lang.InstantiationException異常案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論