Java 使一切非静态

Java 使一切非静态,java,static,Java,Static,作为一种习惯,在java项目中,为了便于测试和使用,我通常避免使用静态方法。然而,在过去,我不得不围绕我的主类使用静态和非静态方法的混乱混合,因为我只知道创建类的非静态实例的一种方法。通常,我将其作为全局变量执行,而不是在每个方法中加载类方法 例如,假设我有MainGUI和ProjMain类。在ProjMain中,我使用全局变量: private MainGUI gui = new MainGUI(); 这非常有效,但是如果我想从MainGUI类访问ProjMain类中的方法,我自然也会这样做

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

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

private MainGUI gui = new MainGUI();
这非常有效,但是如果我想从MainGUI类访问ProjMain类中的方法,我自然也会这样做

private ProjMain project = new ProjMain();

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

您的类彼此都有引用,这很好,但如果每一个都创建了一个对另一个的新引用,那就不是了,因为这只会导致一个无限递归,其中一个创建了另一个的实例,这就创建了第一个的实例,这就创建了另一个的实例。。。。。等等

要解决这个问题,让一个对象创建另一个对象,但只需通过其构造函数或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;
}

你的类彼此都有引用,这是可以的,但如果每个类都创建了一个新的引用,那就不行了,因为这只会导致一个无限递归,其中一个创建了另一个的实例,这会创建第一个的实例,这会创建另一个的实例,这会创建第一个的实例,它创建了另一个的实例。。。。。等等

要解决这个问题,让一个对象创建另一个对象,但只需通过其构造函数或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;
}

气垫船的解决方案非常好,这里我为您提供了另一个:

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

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

并从ProjMain和MainGUI中删除全局变量,以减少耦合。

气垫船的解决方案非常好,这里我为您提供了另一个解决方案:

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

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

并从ProjMain和MainGUI中删除全局变量,以减少耦合。

这适用于两个类的示例,但我的要求范围更广。在我的实际项目中,我有大约12个类希望实现类似的目标,没有任何类重复创建彼此。@SpencerAlderman:概念是一样的。根据需要申请即可。但是如果你需要更具体的帮助,你可能需要编辑你的问题,并在你的问题中提供更多的信息和代码。啊哈,在编辑之前,我比你早了一点。我明白你的意思了,谢谢!这适用于两个类的示例,但我的要求范围更广。在我的实际项目中,我有大约12个类希望实现类似的目标,没有任何类重复创建彼此。@SpencerAlderman:概念是一样的。根据需要申请即可。但是如果你需要更具体的帮助,你可能需要编辑你的问题,并在你的问题中提供更多的信息和代码。啊哈,在编辑之前,我比你早了一点。我明白你的意思了,谢谢!为什么要避免静电干扰?如果您永远不会拥有某个对象的多个实例,那么创建一个具体的类并创建一个不需要的实例是没有好处的。如果提供的方法不需要实例数据,则应将其设置为静态。您使用的模式是“单例”模式,但通常保存单例的变量是一个静态变量,可以避免所有这些问题。根据我的经验,一些程序员认为他们应该避免静态,因为它不是“面向对象的”,但如果您只需要一个,那么就使用静态。为什么要避免静态?如果您永远不会拥有某个对象的多个实例,那么创建一个具体的类并创建一个不需要的实例是没有好处的。如果提供的方法不需要实例数据,则应将其设置为静态。您使用的模式是“单例”模式,但通常保存单例的变量是一个静态变量,可以避免所有这些问题。根据我的经验,一些程序员认为他们应该避免静态,因为它不是“面向对象的”,但如果您只需要一个,那么就使用静态。