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

使用lombok的@Data會導(dǎo)致棧溢出StackOverflowError問題

 更新時間:2022年11月19日 11:45:25   作者:快樂崇拜234  
這篇文章主要介紹了使用lombok的@Data會導(dǎo)致棧溢出StackOverflowError問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

最近擼代碼發(fā)現(xiàn)一個問題,使用lombok的@Data會導(dǎo)致棧溢出StackOverflowError。

問題復(fù)現(xiàn)

兩個類,有循環(huán)引用:

@Data
public class Obj1 {
    private String a;
    private String b;
    private Obj2 obj2;
}

@Data
public class Obj2 {
    private String a;
    private String b;
    private Obj1 obj1;
}

public class Test {
    public static void main(String[] args) {
        Obj1 obj1 = new Obj1();
        Obj2 obj2 = new Obj2();

        obj1.setObj2(obj2);
        obj2.setObj1(obj1);

        System.out.println(obj1);
    }
}

執(zhí)行上述程序,結(jié)果出現(xiàn)棧溢出:

原因分析

首先出現(xiàn)上述問題的場景是出現(xiàn)了循環(huán)依賴。

@Data注解在什么情況下可能導(dǎo)致StackOverflowError情況呢?原因在于@Data重寫了hashCode()方法。

我們看一下兩個類的hashCode方法:

Obj1的hashCode方法

public int hashCode() {
    int PRIME = true;
    int result = 1;
    Object $a = this.getA();
    int result = result * 59 + ($a == null ? 43 : $a.hashCode());
    Object $b = this.getB();
    result = result * 59 + ($b == null ? 43 : $b.hashCode());
    Object $obj2 = this.getObj2();
    result = result * 59 + ($obj2 == null ? 43 : $obj2.hashCode());
    return result;
}

Obj2的hashCode方法

public int hashCode() {
    int PRIME = true;
    int result = 1;
    Object $a = this.getA();
    int result = result * 59 + ($a == null ? 43 : $a.hashCode());
    Object $b = this.getB();
    result = result * 59 + ($b == null ? 43 : $b.hashCode());
    Object $obj1 = this.getObj1();
    result = result * 59 + ($obj1 == null ? 43 : $obj1.hashCode());
    return result;
}

可以看到,計(jì)算obj1的hashcode,需要去獲取obj2的hashcode, 而計(jì)算obj2的hashcode ,又要去獲取obj1的hashcode。所以出現(xiàn)了死循環(huán)。

解決方案

不要使用@data, 使用@Getter, @Setter。

使用lombok還是要慎重啊。而且如果我們的SDK是對外提供的,那么務(wù)必不要使用。以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Windows安裝Maven并配置環(huán)境變量

    Windows安裝Maven并配置環(huán)境變量

    Maven是一個基于Java的項(xiàng)目管理工具,可以管理項(xiàng)目的構(gòu)建、測試和部署,本文就來介紹一下Windows安裝Maven并配置環(huán)境變量,感興趣的可以了解一下
    2024-11-11
  • Spring AOP有多少個通知以及它們的執(zhí)行順序介紹

    Spring AOP有多少個通知以及它們的執(zhí)行順序介紹

    這篇文章主要介紹了Spring AOP有多少個通知以及它們的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java如何基于poi操作Wold工具類

    Java如何基于poi操作Wold工具類

    這篇文章主要介紹了Java如何基于poi操作Wold工具類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 如何使用兩個棧實(shí)現(xiàn)隊(duì)列Java

    如何使用兩個棧實(shí)現(xiàn)隊(duì)列Java

    這篇文章主要介紹了如何使用兩個棧實(shí)現(xiàn)隊(duì)列Java,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • Java如何讀取jar包中的resource資源文件

    Java如何讀取jar包中的resource資源文件

    這篇文章主要介紹了Java如何讀取jar包中的resource資源文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 解決Java Redis刪除HashMap中的key踩到的坑

    解決Java Redis刪除HashMap中的key踩到的坑

    這篇文章主要介紹了解決Java Redis刪除HashMap中的key踩到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java中的靜態(tài)代碼塊與構(gòu)造代碼塊詳解

    Java中的靜態(tài)代碼塊與構(gòu)造代碼塊詳解

    靜態(tài)代碼塊在JVM加載類時執(zhí)行,僅執(zhí)行一次,用于初始化靜態(tài)變量或執(zhí)行一次性設(shè)置,構(gòu)造代碼塊在每次創(chuàng)建對象時執(zhí)行,用于實(shí)例變量的初始化或執(zhí)行創(chuàng)建對象時的公共邏輯,靜態(tài)代碼塊按定義順序執(zhí)行,構(gòu)造代碼塊在構(gòu)造方法前執(zhí)行
    2024-11-11
  • Java刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾)

    Java刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾)

    下面小編就為大家?guī)硪黄狫ava刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾) 。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Java實(shí)現(xiàn)簡單郵件發(fā)送功能

    Java實(shí)現(xiàn)簡單郵件發(fā)送功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單郵件發(fā)送功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • springboot整合shiro之thymeleaf使用shiro標(biāo)簽的方法

    springboot整合shiro之thymeleaf使用shiro標(biāo)簽的方法

    Thymeleaf 是一個跟 Velocity、FreeMarker 類似的模板引擎,它可以完全替代 JSP ,這篇文章主要介紹了springboot整合shiro之thymeleaf使用shiro標(biāo)簽的相關(guān)知識,需要的朋友可以參考下
    2021-10-10

最新評論

申扎县| 邯郸市| 福安市| 曲阜市| 诏安县| 丰原市| 阿勒泰市| 忻州市| 临夏市| 鄂托克旗| 明光市| 礼泉县| 永清县| 霸州市| 齐齐哈尔市| 云阳县| 萨嘎县| 台中市| 宿迁市| 六枝特区| 新疆| 应用必备| 竹北市| 贵溪市| 建昌县| 徐汇区| 沅陵县| 肥乡县| 崇仁县| 香河县| 乾安县| 尚志市| 彭山县| 左权县| 汤阴县| 隆尧县| 龙门县| 彰化市| 霍城县| 富阳市| 鹿泉市|