2012-03-20 24 views
0

给定两个类,在彼此中创建每个类的对象会导致StackOverflow异常。这是一个JAVA项目顺便说一句。给定两个类,在另一个类中创建每个类的对象导致StackOverflow异常

我的项目中有多个类和其他类,我想我会创建另一个类的对象并使用它。

说我有班主和类图形用户界面。我在MAIN中创建了GUI对象并对其进行了初始化。同样,我在GUI中创建了一个MAIN对象并初始化它。

现在这给了我一个堆栈溢出异常,因为构造函数调用正深入到递归中。

我该怎么办?

我能想到的一种可能的解决方案是制作一个类STATIC的变量和方法。

任何其他解决方案?请建议。

回答

6

你应该通过你的一个类的实例,为其他类的构造函数。

public class Main { 
    private final GUI gui; 
    Main() { 
     gui = new GUI(this); 
    } 
} 

public class GUI { 
    private final Main main; 
    public GUI(Main main) { 
     this.main = main; 
    } 
} 

你也可以使用setter而不是构造函数。我不太喜欢这个选项,因为你失去了让你的变量最终确定的能力。

public class Main { 
    private GUI gui; 
    Main() { 
    } 
    public void setGui(GUI gui) { 
     this.gui = gui; 
    } 
} 

public class GUI { 
    private Main main; 
    public GUI() { 
    } 
    public void setMain(Main main) { 
     this.main = main; 
    } 
} 

public static void main(String[] args) { 
    Main main = new Main(); 
    GUI gui = new GUI(); 
    main.setGui(gui); 
    gui.setMain(main); 
} 
+1

这是正确的,但它也是你通常应该做的方法静态的,当他们不访问任何本地信息的情况下 - 而且,作为Jigar乔希下面提到的,它可以使感,使之成为单例类如果你真的只需要你的整个应用程序中的一个。 – 2012-03-20 19:34:14

+0

但后来我有第三类RecieveThread访问GUI类。我也需要一个物体。所以添加主参数将无法正常工作。 – 2012-03-20 19:43:15

+0

@AhishekNandgaonkar您可以将一个GUI对象添加到RecieveThread的构造函数中。如果关系变得足够复杂,你可能希望使用创建所有没有实例的类,然后创建初始化每个类的setter。然后构建所有选项并调用所有setter的一段代码。 – 2012-03-20 19:47:43

0

单身? (它是否适合你的应用程序)

相关问题