2017-09-20 26 views
0

我最近學到了一種叫做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

回答

0

如果不定義構造函數,那麼當你做「新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類中,然後代碼可以調用私有構造函數。當通話結束後,您退出該框。 –

0

單例是一種設計模式,用於確保從應用程序中運行的該類創建的對象只有一個實例。

因此,使構造函數專用,確保該類之外的任何人都不能創建該對象(類)的實例。

所以靜態塊用於類的靜態初始化並且只運行一次,所以當在另一個類中的主要運行時並且 示例s1 = Sample.getSample();

發生時,靜態方法運行創建對象Sample的實例作爲s。然後getSample()將s1設置爲該初始化對象。因此,查看s1的hashCode會返回s實例的哈希碼。

對s2執行相同的操作將返回相同的hashCode,因爲它們都來自同一個實例。

相關問題