当前位置: 首页 > 面试题库 >

Java类中的循环依赖

祝宏放
2023-03-14
问题内容

我有以下课程。

public class B 
{
    public A a;

    public B()
    {
        a= new A();
        System.out.println("Creating B");
    }
}

public class A 
{
    public B b;

    public A()
    {
        b = new B();
        System.out.println("Creating A");
    }

    public static void main(String[] args) 
    {
        A a = new A();
    }
}

可以清楚地看到,这些类之间存在循环依赖关系。如果尝试运行A类,最终会得到StackOverflowError

如果创建了一个依赖图,其中节点是类,则可以轻松地识别这种依赖关系(至少对于节点很少的图)。那么,为什么JVM至少在运行时无法识别此身份?StackOverflowErrorJVM至少可以在开始执行之前发出警告,而不是抛出。

[更新]
某些语言不能具有循环依赖关系,因为这样就无法构建源代码。和可接受的答案。如果循环依赖性是C#的设计味道,那么为什么Java不这样呢?仅因为Java可以(编译具有循环依赖项的代码)?

[update2]
最近找到了jCarder。根据该网站,它通过动态检测Java字节代码并在对象图中查找循环来发现潜在的死锁。谁能解释该工具如何找到周期?


问题答案:

您的类A的构造函数调用类B的构造函数。类B的构造函数调用类A的构造函数。您有一个无限递归调用,这就是为什么最终有一个。

Java支持类之间具有循环依赖关系,这里的问题仅与构造函数相互调用有关。

您可以尝试以下方法:

A a = new A();
B b = new B();

a.setB(b);
b.setA(a);


 类似资料:
  • 问题内容: 对于以下代码: 输出为:X = 1,Y = 2 为什么?如何??? -伊瓦尔 PS:摘自JavaCamp.org的代码段 问题答案: 以下是按时间顺序发生的情况: 类包含主方法,因此它由类加载器加载。 引用的初始化,因此类被加载。 有一个初始化为的静态变量。 的初始化尚未执行,因此求值为0,因此将1分配给 现在已经完成加载,并且可以初始化。 值(1 +1)被分配给。 的值和被打印为和分

  • 问题内容: 我已经搜索了很多,但是我发现的主要是python中的递归编程示例。因此,问题来了: 我该如何实现? 问题答案: 一切在Python中都是动态的-甚至是类声明。在初始声明之后,没有什么可以阻止您修改类的内容的: 注意:如果您不太熟悉Python,则该关键字仅允许您说“这里什么都没有”-除非A类的空值与本例中的一样空,否则它并不重要!

  • 问题内容: 我有两个文件和,分别定义了两个类和。 直到今天,用于引用该对象的定义,因此我已经做了 在文件中。 但是,到目前为止,我已经为引用该对象的对象创建了一个新方法。 尝试导入时遇到了问题:我尝试了一下,当程序运行并调用了using的方法时,出现了一个未定义的异常。 我该怎么办? 问题答案: 导入Python模块 是一篇很棒的文章,介绍了Python中的循环导入。 解决此问题的最简单方法是将路

  • 问题内容: 假设我具有以下目录结构: 在软件包的中,将导入软件包。但是进口。 程序失败,表示尝试导入b时不存在。(它实际上不存在,因为我们正在导入它。)`c_file.pya.b.d `如何解决这个问题? 问题答案: 如果a取决于c,而c取决于a,那么它们实际上不是同一单位吗? 您应该真正检查一下为什么将a和c拆分为两个包,因为您应该将一些代码拆分为另一个包(以使它们都依赖于该新包,而不是彼此依赖

  • 问题内容: 我有一个模块化的maven项目,其中两个模块“ BIZ”和“ EJB”包含如下内容: 如您所见, “ EJB”依赖于“ BIZ”, 因为它使用 MyClassX (实际上,它使用了BIZ的几种类别)。这就是 ImplFactory 使用反射实例化 InterfaceImpl 的原因。问题是 cl.newInstance() 将抛出 ClassCastException, 因为这两个模块

  • 问题内容: 我正在读一本书,重新整理了我的数据结构,它提出的一个问题是不使用“第一个”和“最后一个”指针来构建一个循环的单链表,而是通过使用一个引用来访问它。当前”。我不确定我是否理解这个问题,我一直以为我至少需要第一个或最后一个。这是我的实现,但是它具有“ first”,不确定如何解决。您能否评论一下如何调整代码以消除对第一代码的依赖? 然后是列表本身: 问题答案: 如果您有一个循环链表,则每个