使用lombok的@Data會導致棧溢出StackOverflowError問題
最近擼代碼發(fā)現(xiàn)一個問題,使用lombok的@Data會導致棧溢出StackOverflowError。
問題復現(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í)行上述程序,結果出現(xiàn)棧溢出:
原因分析
首先出現(xiàn)上述問題的場景是出現(xiàn)了循環(huán)依賴。
@Data注解在什么情況下可能導致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是對外提供的,那么務必不要使用。以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot2開啟Actuator端點監(jiān)控的方法
這篇文章主要介紹了SpringBoot2開啟Actuator端點監(jiān)控的相關資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06Java并發(fā) CompletableFuture異步編程的實現(xiàn)
這篇文章主要介紹了Java并發(fā) CompletableFuture異步編程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01MyBatis-Plus中MetaObjectHandler沒生效完美解決
在進行測試時發(fā)現(xiàn)配置的MyMetaObjectHandler并沒有生效,本文主要介紹了MyBatis-Plus中MetaObjectHandler沒生效完美解決,具有一定的參考價值,感興趣的可以了解一下2023-11-11使用shardingsphere對SQLServer坑的解決
本文主要介紹了使用shardingsphere對SQLServer坑的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-03-03