如果singleton类构造函数是私有的并且从其他类调用方法* SEE CODE *那么它是如何工作的

时间:2017-09-20 04:44:38

标签: java design-patterns singleton

我最近学会了一个名为singleton类的Designed模式。 在我学习java之前,我知道关键字如静态块(它在main方法之前执行)静态关键字(我们不需要为调用方法创建对象),final(我们需要指定值/类不能扩展/方法不能覆盖等)和构造函数(具有相同名称的方法,在创建对象时自动调用)等。 所以在这里发生的事情是我无法将一切都联系起来。请向我解释这个部门是如何运作的。 为什么我们使用私有构造函数,静态块等 这是代码,请逐行解释。

public class Sample {  
  final static Sample s; 

  static  {
    s= new Sample();  
  }  
  private Sample() { 
  }  
  static Sample getSample() {   
    return s;  
  }     
} 



public class Runner { 

  public static void main(String[] args)   { 
    Sample s1 = Sample.getSample();
    int x=s1.hashCode();
    Sample s2 =Sample.getSample();
    int y= s2.hashCode();
    System.out.println(x);
    System.out.println(y);
  } 
} 

2 个答案:

答案 0 :(得分:0)

如果您没有定义构造函数,那么当您执行新的SomeClass()"时,Java将调用默认构造函数,即:

public SomeClass() { }

现在,您正在应用Singleton模式,因此您不希望允许来自课外的对象实例化,这就是您重新声明"默认构造函数,但是" private"。这样,您只能从内部创建此类的对象。正如你在这里看到的那样:

static {
   s = new Sample();  
}

我希望这个解释澄清你的怀疑。

PS:你也可以参考这篇文章,它很好地解释了模式:https://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples

干杯!

答案 1 :(得分:0)

单例是一种设计模式,用于确保在应用程序中运行的该类只创建一个对象实例。

因此,将构造函数设置为private将确保该类外部没有人可以创建该对象(类)的实例。

所以静态块用于类的静态初始化并且只运行一次,所以当另一个类中的main运行时     样本s1 = Sample.getSample();

发生,静态方法运行创建对象Sample的实例为s。然后getSample()将s1设置为该初始化对象。因此,查看s1的hashCode会返回s实例的哈希码。

对s2执行相同的操作将返回相同的hashCode,因为它们都来自同一个实例。