Java: getInstance vs Static

2022-09-01 08:59:05

在Java中的目的是什么?getInstance()

在我的研究过程中,我一直在阅读有助于实现Singleton设计模式的内容(这意味着在我的理解中,整个程序中只有一个实例)。但是我不能只使用静态吗?这难道不是静态的全部意义吗?getInstance()

如果我只有静态方法和字段,它与使用有什么不同?静态是否有“范围”?例如,每个方法或类一个实例?getInstance()

如果它们不同,在什么情况下我会选择使用静态?getInstance()

如果问题不清楚,我很抱歉,我确信我错过了一些关于主题的东西,我只是无法弄清楚是什么。

感谢您的任何和所有建议。


答案 1

静态不会给你一个单例。由于在Java中没有办法使顶级类成为单例,因此您可以使用getInstance方法来实现一些逻辑以确保只有一个类的实例。

public class Singleton {

   private static Singleton singleton;

   private Singleton(){ }

   public static synchronized Singleton getInstance( ) {
      if (singleton == null)
          singleton=new Singleton();
      return singleton;
   }

}

看看这个最重要的答案:Java中的静态类

上面的代码只允许创建一个实例,而且很干净,但是从Java 1.6开始,最好这样创建单例,因为它稍微优雅一些恕我直言:

public enum MyEnumSingleton {
    INSTANCE;

    // other useful methods here
} 

资料来源:http://www.vogella.com/tutorials/DesignPatternSingleton/article.html


答案 2

单身 人士

单例允许您使用对 java 对象的单个引用。例如,这里有一个包含数字的单例;

public class MySingleton {

    private int myNumber;
    private static MySingleton instance;

    public static MySingleton getInstance() {
        if (instance == null) {
             instance = new MySingleton();
        }
        return instance;
    }

    private MySingleton() {}

    public void setMyNumber(int myNumber) {
        this.myNumber = myNumber;
    }

    public int getMyNumber() {
       return myNumber;
    }
}

现在我们将在 A 类中设置此数字的值:

public class A {
    /*...*/
    MySingleton mySingleton = MySingleton.getInstance();
    mySingleton.setMyNumber(42);
    /*...*/
}

然后,您可以从另一个类访问此值:

public class B {
    /*...*/
    MySingleton mySingleton = MySingleton.getInstance();
    int number = mySingleton.getMyNumber();
    /*...*/
}

在此类中,变量的值为 42。这是单例相对于简单对象的优势:number

存储在单例中的所有值都可以从“任何地方”访问。


静态类

目的是不同的,这里的优点是使用对象而不必创建它。

例如:

public static class MyStaticClass {
    public static void sayHello() {
        System.out.println("Hello");
    }
}

现在,您可以通过调用从任何类中使用 sayHello() 方法:

MyStaticClass.sayHello(); 

推荐