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