如果单例类构造函数是私有的,并从其他类调用方法* 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); 
    } 
} 
+1

'static'块在同一个类中,因此它可以访问'private'构造函数。 –

+0

私有构造函数,以便它可以从类内调用。 – nullpointer

+1

单例的目的是控制对实例的访问。通过使用私有构造函数和访问器方法,可以防止其他人构建实例。因此你有一个单身人士。 – dave

如果不定义构造函数,那么当你做“新SomeClass的()”,Java将调用默认构造函数,它是:

public SomeClass() { } 

现在,你申请的单例模式,所以你不想允许来自类外的对象实例化,这就是为什么你“重新声明”默认构造函数而是“私有”。这样,你只能从里面创建这个类的对象。正如你可以看到这里:

static { 
    s = new Sample(); 
} 

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

PS:您也可以参考这篇文章的模式解释得非常好:https://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples

干杯!

+0

但老兄看看代码,我用了不同的类,并从不同的类中调用“PRIVATE Con​​structor”。 这怎么可能 – mainhoonlucky

+0

我没有看到你在哪里调用Runner中的私有构造函数。我只看到你正在做Sample.getSample(),它是Sample的一个静态方法。 您能否指出您调用私有构造函数的哪一行代码? 干杯! –

+0

@mainhoonlucky您可以从外部调用一个公共静态的Singleton方法,但是这会将**放入** Singleton类中,然后代码可以调用私有构造函数。当通话结束后,您退出该框。 –

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

因此,使构造函数专用,确保该类之外的任何人都不能创建该对象(类)的实例。

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

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

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