如何在彼此 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() );
我搜索了整个 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() );