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

 更新时间:2022年11月19日 11:45:25   作者:快乐崇拜234  
这篇文章主要介绍了使用lombok的@Data会导致栈溢出StackOverflowError问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

问题复现

两个类,有循环引用:

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

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

原因分析

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

@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。所以出现了死循环。

解决方案

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

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

相关文章

  • Windows安装Maven并配置环境变量

    Windows安装Maven并配置环境变量

    Maven是一个基于Java的项目管理工具,可以管理项目的构建、测试和部署,本文就来介绍一下Windows安装Maven并配置环境变量,感兴趣的可以了解一下
    2024-11-11
  • Spring AOP有多少个通知以及它们的执行顺序介绍

    Spring AOP有多少个通知以及它们的执行顺序介绍

    这篇文章主要介绍了Spring AOP有多少个通知以及它们的执行顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java如何基于poi操作Wold工具类

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

    这篇文章主要介绍了Java如何基于poi操作Wold工具类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 如何使用两个栈实现队列Java

    如何使用两个栈实现队列Java

    这篇文章主要介绍了如何使用两个栈实现队列Java,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    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中的静态代码块与构造代码块详解

    Java中的静态代码块与构造代码块详解

    静态代码块在JVM加载类时执行,仅执行一次,用于初始化静态变量或执行一次性设置,构造代码块在每次创建对象时执行,用于实例变量的初始化或执行创建对象时的公共逻辑,静态代码块按定义顺序执行,构造代码块在构造方法前执行
    2024-11-11
  • Java删除指定文件夹下的所有内容的方法(包括此文件夹)

    Java删除指定文件夹下的所有内容的方法(包括此文件夹)

    下面小编就为大家带来一篇Java删除指定文件夹下的所有内容的方法(包括此文件夹) 。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Java实现简单邮件发送功能

    Java实现简单邮件发送功能

    这篇文章主要为大家详细介绍了Java实现简单邮件发送功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • springboot整合shiro之thymeleaf使用shiro标签的方法

    springboot整合shiro之thymeleaf使用shiro标签的方法

    Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP ,这篇文章主要介绍了springboot整合shiro之thymeleaf使用shiro标签的相关知识,需要的朋友可以参考下
    2021-10-10

最新评论