Java:getInstance vs Static

Fre*_*Dan 28 java singleton static design-patterns

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

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

如果我只是有静态方法和字段,它与使用getInstance()有何不同?是否存在静态的"范围"?例如,每个方法或类一个实例?

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

如果问题不清楚,我很抱歉,我确信我遗漏了一些有关主题的内容,我只是无法弄清楚是什么.

感谢您提供任何建议.

Zac*_*ano 15

静态不会给你一个单身人士.由于无法在Java中将顶级类设为单例,因此您可以使用getInstance方法实现某些逻辑,以确保只有一个类的实例.

public class Singleton {

   private static Singleton singleton;

   private Singleton(){ }

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

public enum MyEnumSingleton {
    INSTANCE;

    // other useful methods here
} 
Run Code Online (Sandbox Code Playgroud)

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


G.T*_*.T. 10

独生子

单例允许您使用对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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们要在A类中设置这个数字的值:

public class A {
    /*...*/
    MySingleton mySingleton = MySingleton.getInstance();
    mySingleton.setMyNumber(42);
    /*...*/
}
Run Code Online (Sandbox Code Playgroud)

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

public class B {
    /*...*/
    MySingleton mySingleton = MySingleton.getInstance();
    int number = mySingleton.getMyNumber();
    /*...*/
}
Run Code Online (Sandbox Code Playgroud)

在这个类中,number变量的值为42.这是单例优于简单对象的优点:

存储在单例中的所有值都可以从"到处"访问.


静态类

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

例如:

public static class MyStaticClass {
    public static void sayHello() {
        System.out.println("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

MyStaticClass.sayHello(); 
Run Code Online (Sandbox Code Playgroud)