使用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;
}可以看到,計算obj1的hashcode,需要去獲取obj2的hashcode, 而計算obj2的hashcode ,又要去獲取obj1的hashcode。所以出現(xiàn)了死循環(huán)。
解決方案
不要使用@data, 使用@Getter, @Setter。
使用lombok還是要慎重啊。而且如果我們的SDK是對外提供的,那么務(wù)必不要使用。以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring AOP有多少個通知以及它們的執(zhí)行順序介紹
這篇文章主要介紹了Spring AOP有多少個通知以及它們的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
解決Java Redis刪除HashMap中的key踩到的坑
這篇文章主要介紹了解決Java Redis刪除HashMap中的key踩到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Java刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾)
下面小編就為大家?guī)硪黄狫ava刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾) 。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
springboot整合shiro之thymeleaf使用shiro標(biāo)簽的方法
Thymeleaf 是一個跟 Velocity、FreeMarker 類似的模板引擎,它可以完全替代 JSP ,這篇文章主要介紹了springboot整合shiro之thymeleaf使用shiro標(biāo)簽的相關(guān)知識,需要的朋友可以參考下2021-10-10

