Java - 来自相反类引用的堆栈溢出错误

时间:2013-08-14 21:50:43

标签: java class compiler-errors stack-overflow

我遇到了Java程序抛出堆栈溢出错误的问题,我确定该问题与两个类文件相互引用有关。例如,在第一类中,有一行第二行= new two();而在第二类中,有一行第一行= new one();.我需要这些类能够共享方法,这是我能做我想做的唯一方法。如何在没有递归导致堆栈溢出问题的情况下让两个类相互引用?

1 个答案:

答案 0 :(得分:2)

你正在做这样的事情,我猜:

class A {
  private B b = new B();

}

class B {
  private A a = new A();

}

当你这样做时,A创建一个新的B实例,然后创建一个新的A实例,然后创建一个新的B实例,然后创建一个新的A实例,然后创建一个新的B实例,然后创建一个新的实例。然后创建一个新B实例的实例....

这导致了一个递归的噩梦。

解决方案:不要递归地创建新对象。而是通过setter方法将一个对象的引用传递给另一个对象。例如......

class A {
  private B b;

  public void setB(B b) {
    this.b = b;
  } 
}

class B {
  private A a;

  public void setA(A a) {
    this.a = a;
  } 
}

主要代码

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

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

甚至更好,使用依赖注入,例如可以使用Guice(尽管我不确定您是否可以使用此工具创建彼此引用的对象)。请确保不先使用a或b变量,而不先检查它们是否为空。

顺便说一下,你的程序设计会导致A和B类的紧密耦合,你应该考虑使用设计模式来减少这种耦合,例如观察者模式。


修改
你说:

  

我不明白这段代码的作用。你能不能对我做一点评论,以便我能更好地理解它?我如何使用此代码使用其他类中的方法?

代码的第一位是你正在做的我认为(我不确定,因为你没有显示代码),并且根据我的说明,这将导致代码一直运行直到stackoverflow发生。我的第二部分代码删除了每个类中创建另一个类的实例的代码。相反,它具有设置类引用的setter方法。如果您不熟悉getter和setter方法(也称为mutator和accessor方法),我建议您查找并查看有关该主题的教程,因为它们在Java中被大量使用。但简而言之,类A有一个方法setB(B b),允许外部类将完全创建的B对象传递给A对象。因此,不是A创建一个 new B对象,它允许外部类传递已经生成的 B对象,因此您不会再次出现。 B类代码也一样。