如何在彼此 Java 中调用两个 类 的方法时避免 stackoverflow

How to avoid stackoverflow while calling methods of two classes in eachother Java

我搜索了整个 Whosebug 网站我只找到一个最近的网站 回答但不适合我的情况。

如何互相调用两个 class 的方法

首先Class是Alpha并调用Beta的函数

public Class Alpha
    {
       Beta obj;

   public Alpha()
   {
       obj = new Beta();
   }
   public void A()
   {
      print A;
      obj.B();
   }
}

第二个Class是Beta并调用Alpha的函数

public Class Beta
{
   Alpha obj;

   public Beta()
   {
       obj = new Alpha();
   }
   public void B()
   {
      print B;
      obj.A()
   }
}

在Java/android中显示Whosebug异常。由于构造函数相互递归调用。

如何避免这个异常?

我有 15 个 Classes,每个都循环链接。

我需要使用父级 class 吗?

或者我应该如何使用构造函数来避免 Whosebug 异常?

您应更改 class Beta 的定义以打破两个 class 之间的循环 link 并创建它们的实例。它可能有点像这样:

public class Beta {
   Alpha obj;

   public Beta() {
   }

   public void B() {
      print B;
      new Alpha().A();
   }
}

理想情况下,您不应创建其他 classes 的实例,除非您想要访问它们。

这里有一个打破循环的建议:指定一个 class 作为 parent,另一个作为依赖。

让我们让 Alpha 负责:

public class Alpha {

   private Beta beta;

   public Alpha() {
       this.beta = new Beta(this);
   }
}

这是 child 测试版:

public class Beta {

   private Alpha alpha;

   public Beta(Alpha parent) {
       this.alpha = parent;
   }
}

没有更多的循环。

堆栈溢出明显;不仅仅是 class 定义是循环的;构造函数是递归的。递归只是 "hidden" 因为它们在不同的 class 中。对于任何递归,都必须有一些限制条件来打破递归循环。不知道你的问题的细节——为什么你有这个周期性的定义——很难给出解决方案。这实际上归结为代码架构问题。我可以提供一些建议。

首先,我通常不喜欢循环定义。它会导致在进行代码构建和移植时出现混乱和问题。这可以通过使用接口来避免;也许是一个空的标记界面。然后我会从构造函数中获取内部对象的赋值,并创建一个显式的 set() 函数,以便调用者必须初始化这些:

public interface SomeInterface {  }

public class Alpha implements SomeInterface
{ 
   private SomeInterface obj; 
   public Alpha()
   {}

   public void setBeta (SomeInterface si)
   {
     obj = si;
   } 
}

public class Beta implements SomeInterface
{ 
  private SomeInterface obj;
  public Beta () 
  { }

  public void setAlpha ( SomeInterface si )
  {
    obj = si;
  }
}

在调用代码中,您将

Alpha a = new Alpha();
a.setBeta ( new Beta() );