如果单例类构造函数是私有的,并从其他类调用方法* SEE CODE *那么它如何工作
我最近学到了一种叫做singleton类的Designed模式。 (我们不需要为调用方法创建对象),最后(我们需要指定值/类不能扩展/方法不能被overrided等)和构造函数(方法具有相同的名称,当我们创建对象时会自动调用)等等。 因此,这里发生在我身上的是我无法涉及所有事情。请向部门解释这是如何工作的。 为什么我们使用私有构造函数,静态块等等 在这里它的代码,请逐行解释我。如果单例类构造函数是私有的,并从其他类调用方法* SEE CODE *那么它如何工作
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);
}
}
如果不定义构造函数,那么当你做“新SomeClass的()”,Java将调用默认构造函数,它是:
public SomeClass() { }
现在,你申请的单例模式,所以你不想允许来自类外的对象实例化,这就是为什么你“重新声明”默认构造函数而是“私有”。这样,你只能从里面创建这个类的对象。正如你可以看到这里:
static {
s = new Sample();
}
我希望这个解释澄清你的疑惑。
PS:您也可以参考这篇文章的模式解释得非常好:https://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples
干杯!
但老兄看看代码,我用了不同的类,并从不同的类中调用“PRIVATE Constructor”。 这怎么可能 – mainhoonlucky
我没有看到你在哪里调用Runner中的私有构造函数。我只看到你正在做Sample.getSample(),它是Sample的一个静态方法。 您能否指出您调用私有构造函数的哪一行代码? 干杯! –
@mainhoonlucky您可以从外部调用一个公共静态的Singleton方法,但是这会将**放入** Singleton类中,然后代码可以调用私有构造函数。当通话结束后,您退出该框。 –
单例是一种设计模式,用于确保从应用程序中运行的该类创建的对象只有一个实例。
因此,使构造函数专用,确保该类之外的任何人都不能创建该对象(类)的实例。
所以静态块用于类的静态初始化并且只运行一次,所以当在另一个类中的主要运行时并且 示例s1 = Sample.getSample();
发生时,静态方法运行创建对象Sample的实例作为s。然后getSample()将s1设置为该初始化对象。因此,查看s1的hashCode会返回s实例的哈希码。
对s2执行相同的操作将返回相同的hashCode,因为它们都来自同一个实例。
'static'块在同一个类中,因此它可以访问'private'构造函数。 –
私有构造函数,以便它可以从类内调用。 – nullpointer
单例的目的是控制对实例的访问。通过使用私有构造函数和访问器方法,可以防止其他人构建实例。因此你有一个单身人士。 – dave