为什么Object在Singleton模式中变为静态?

时间:2014-11-18 11:36:41

标签: java design-patterns

为什么Object在Singleton模式中成为static? 它的实际用途是什么? 如果我们不让对象静止会发生什么?

public class SingleObject {

   //create an object of SingleObject
   private static SingleObject instance = new SingleObject();

   //make the constructor private so that this class cannot be
   //instantiated
   private SingleObject(){}

   //Get the only object available
   public static SingleObject getInstance(){
       return instance;
   }

   public void showMessage(){
       System.out.println("Hello World!");
   }
}

3 个答案:

答案 0 :(得分:3)

您通常将Singleton类的单个实例保存在该类的静态变量中。这不会使该实例成为静态。只有对它的引用是静态的。

由于您只能通过类的静态方法获取该单个实例(您无法通过构造函数显式构造Singleton类的实例 - 否则它不会是单例),对该实例的引用必须存储在静态变量中。

答案 1 :(得分:1)

只需添加/详细说明eran的答案,由于getInstance方法是静态方法,因此可以使用类名从Single方法或其他方法中调用getInstance方法,即使用SingleObject.getInstance();。这意味着您将不需要对象引用来调用getInstance()

如果它是实例方法,则需要一个对象来调用getInstance。现在无法在类外创建SingleObject类的对象(因为构造函数是private),这是真正的麻烦。

结论1: 这意味着我们需要一个静态方法。

结论2: 因为实例属性在静态方法中不可用,所以需要具有静态方法,使属性为静态。

答案 2 :(得分:0)

  

如果我们不使对象静态化,会发生什么?

这意味着getInstance方法必须是非静态的,因为静态方法不能引用当前类 1 中的非静态变量。

但是getInstance方法必须是 static ...否则此API设计没有意义 2


1-...除非传递了对该对象的引用,否则在这种情况下将不起作用。

2-您需要对单例实例的引用才能获取对单例实例的引用。但是您不能创建该实例,因为该类是私有的……阻止某人创建第二个实例。