开发者

使用lombok的@Data会导致栈溢出StackOverflowError问题

目录
  • 问题复现
  • 原因分析
    • Obj1的hashCode方法
    • Obj2的hashCode方法
  • 解决方案

    最近撸代码发现一个问题,使用lombok的@Data会导致栈溢出StackOverflowError。

    问题复现

    两个类,有循环引用:

    @Data
    publiwww.devze.comc class Obj1 {
        private String a;
        private String b;
        private Obj2 obj2;
    }
    
    @Data
    public pythonclass Obj2 {
        private String a;
        private String b;
        private Obj1 obj1;
    }
    
    public class Test {
        public static void main(String[] args) {
            Obj1 obj1 = new Obj1();
            开发者_C学习Obj2 obj2 = new Obj2();
    
            obj1.setObj2(obj2);
            obj2.setObj1(obj1);
    
            System.out.println(obj1);
        }
    }

    执行上述程序,结果出现栈溢出:

    使用lombok的@Data会导致栈溢出StackOverflowError问题

    原因分析

    首先出现上述问题的场景是出现了循环依赖。

    @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的hashc编程客栈ode。所以出现了死循环。

    解决方案

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

    使用lombok还是要慎重啊。而javascript且如果我们的SDK是对外提供的,那么务必不要使用。以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜