由单例代码中的循环造成的堆栈溢出
Stack overflow created by a cycle in code with singletons
我有两个单例 classes,我们称它们为 class A
和 class B
.
class看起来像这样。
class A
{
private static A instance;
private A(int timeout)
{
init();
}
public static A getInstance(int timeout)
{
if(instance == null)
{
instance = new A(timeout);
}
return instance;
}
private void init()
{
new Monitor().sendMonitorStatus();
}
}
和 class B
class B
{
private static B instance;
private B(A a)
{
}
public static B getInstance(A a)
{
if(instance == null)
{
instance = new B(a);
}
return instance;
}
}
然后还有一个名为 Monitor
的 class 看起来也是如此。
class Monitor
{
public void sendMonitorStatus()
{
B.getinstance(A.getinstance(10));
}
}
如您所见,问题是我得到一个 Whosebug
,因为它保持一个循环,先调用 B
,然后调用 A
,然后调用 B
它调用了 A
...,是否可以在不重新设计的情况下解决这个问题,或者是解决导致此错误的循环的唯一方法是重新设计 classes 的工作方式?
要创建 A
的实例,您需要调用 Monitor::sendMonitorStatus
。要调用 Monitor::sendMonitorStatus
,您需要一个 A
的实例。你有一个依赖周期。
你需要重新设计这个。具体如何——这取决于你想要实现什么。
我有两个单例 classes,我们称它们为 class A
和 class B
.
class看起来像这样。
class A
{
private static A instance;
private A(int timeout)
{
init();
}
public static A getInstance(int timeout)
{
if(instance == null)
{
instance = new A(timeout);
}
return instance;
}
private void init()
{
new Monitor().sendMonitorStatus();
}
}
和 class B
class B
{
private static B instance;
private B(A a)
{
}
public static B getInstance(A a)
{
if(instance == null)
{
instance = new B(a);
}
return instance;
}
}
然后还有一个名为 Monitor
的 class 看起来也是如此。
class Monitor
{
public void sendMonitorStatus()
{
B.getinstance(A.getinstance(10));
}
}
如您所见,问题是我得到一个 Whosebug
,因为它保持一个循环,先调用 B
,然后调用 A
,然后调用 B
它调用了 A
...,是否可以在不重新设计的情况下解决这个问题,或者是解决导致此错误的循环的唯一方法是重新设计 classes 的工作方式?
要创建 A
的实例,您需要调用 Monitor::sendMonitorStatus
。要调用 Monitor::sendMonitorStatus
,您需要一个 A
的实例。你有一个依赖周期。
你需要重新设计这个。具体如何——这取决于你想要实现什么。