【发布时间】:2013-08-14 21:50:43
【问题描述】:
我遇到了一个 Java 程序引发堆栈溢出错误的问题,我确定该问题与两个类文件相互引用有关。例如,在第一类中,有一行二二 = new two();,而在二类中,有一行一一 = new one();。我需要这些类能够共享方法,这是我可以做我想做的事情的唯一方法。我怎样才能让这两个类相互引用而不会导致堆栈溢出问题的递归?
【问题讨论】:
标签: java class compiler-errors stack-overflow
我遇到了一个 Java 程序引发堆栈溢出错误的问题,我确定该问题与两个类文件相互引用有关。例如,在第一类中,有一行二二 = new two();,而在二类中,有一行一一 = new one();。我需要这些类能够共享方法,这是我可以做我想做的事情的唯一方法。我怎样才能让这两个类相互引用而不会导致堆栈溢出问题的递归?
【问题讨论】:
标签: java class compiler-errors stack-overflow
我猜你正在做这样的事情:
class A {
private B b = new B();
}
class B {
private A a = new A();
}
当你这样做时,A 创建一个新的 B 实例,然后创建一个新的 A 实例,然后创建一个新的 B 实例,然后创建一个新的 A 实例,然后创建一个新的 B 实例,然后创建一个新的 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 类的紧密耦合,您应该考虑使用设计模式来减少这种耦合,例如观察者模式。
编辑
你说:
我不明白这段代码的作用。您能否为我评论一下,以便我更好地理解它?我将如何使用其他类的方法使用此代码?
第一段代码是我认为你目前正在做的(我不确定,因为你没有显示代码),根据我的笔记,这将导致代码永远运行,直到堆栈溢出发生。我的第二段代码删除了每个类中创建另一个类的实例的代码。相反,它具有设置类引用的 setter 方法。如果您不熟悉 getter 和 setter 方法(也称为 mutator 和 accessor 方法),我强烈建议您查找并查看有关该主题的教程,因为它们在 Java 中被大量使用。但简而言之,A 类有一个方法setB(B b),它允许外部类将完全创建的 B 对象传递给您的 A 对象。因此,它不是 A 创建一个 new B 对象,而是让外部类传入一个 已经制作的 B 对象,这样您就不会重复出现。 B类代码也一样。
【讨论】:
this 是 current 对象,它拥有您所在的方法或构造函数。这是一个非常基本和关键的概念,您还需要了解更多信息。