使一切都是非静态的

时间:2013-03-02 05:18:19

标签: java static

作为一种习惯,我通常会避免在我的java项目中使用静态方法进行测试和易于使用。但是,在过去,我不得不使用围绕我的主类的混乱的静态和非静态方法,因为我只知道创建类的非静态实例的一种方法。通常,我将此作为全局变量,而不是在每个方法中加载类方法。

举个例子,假设我有类MainGUI和ProjMain。在ProjMain中,我使用全局变量:

private MainGUI gui = new MainGUI();

这非常有效,但是如果我想在MainGUI类中访问ProjMain类中的方法,我自然会去做同样的事情。

private ProjMain project = new ProjMain();

在此,我创建了一个StackOverflowError。有没有一种简单的方法可以将类的实例作为变量,而不必将变量放在单独的方法而不是全局方法中?

2 个答案:

答案 0 :(得分:2)

Hovercraft的解决方案非常好,我在这里有另一个解决方案:

如果你有很多类相互引用,你应该考虑为它们提取更高层,更高层的类应该是这样的:

class HigherLayer {
    public void dosomething(ProjMain pm, MainGUI  mg){
         pm.hello(mg);
         mg.bye(pm);
    }
}

从ProjMain和MainGUI中删除全局变量,使它们更少耦合。

答案 1 :(得分:1)

你的类有彼此的引用,这是可以的,但是如果每个都创建一个对另一个的新引用,那就不行了,因为这样做什么都不会导致一个创建另一个实例的无限递归,这会创建一个实例第一个创建另一个实例,创建第一个实例,创建另一个实例,.....等......

要解决此问题,请让一个对象创建另一个对象,但只需通过它的构造函数或setter方法将对的引用传递给另一个对象。

例如,第一堂课:

public class FirstClass {
   private SecondClass secondClass;

   public FirstClass() {
     secondClass = new SecondClass(this);
}

和另一个班级

public class SecondClass {
   private FirstClass firstClass;

   public FirstClass(FirstClass firstClass) {
     this.firstClass = firstClass;
}