-4

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

4

1 回答 1

2

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

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

}

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

}

当你这样做时,A创建一个新的B实例,然后创建一个新的A实例,然后创建一个新的B实例,然后创建一个新的A实例,然后创建一个新的B实例,然后创建一个新的A实例然后创建一个新的 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 创建一个的B 对象,而是让外部类传递一个已经创建的B对象,所以你不会得到复发。B类代码也是如此。

于 2013-08-14T21:52:42.673 回答