我最近学会了一个名为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);
}
}
答案 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,因为它们都来自同一个实例。