2016-10-13 195 views
-7

This answer表示我們不能通過private構造函數一次實例化多個對象。我修改了正好相反的代碼:爲什麼我們需要一個私有構造函數?

class RunDatabase{ 
    public static void main(String[] args){ 
     Database db = Database.getInstance("hello");//Only one object can be instantiated at a time 
     System.out.println(db.getName()); 
     Database db1 = Database.getInstance("helloDKVBAKHVBIVHAEFIHB"); 
     System.out.println(db1.getName()); 
    } 
} 
class Database { 

    //private static Database singleObject; 
    private int record; 
    private String name; 

    private Database(String n) { 
     name = n; 
     record = 0; 
    } 

    public static synchronized Database getInstance(String n) { 
     /*if (singleObject == null) { 
      Database singleObject = new Database(n); 
     } 

     return singleObject;*/ 

     return new Database(n); 
    } 

    public void doSomething() { 
     System.out.println("Hello StackOverflow."); 
    } 

    public String getName() { 
     return name; 
    } 
} 

而且正如預期的那樣,這兩個字符串正在被打印。我錯過了什麼?

+2

是啊,你錯過了您的statment(的問題),exlusivly refered到'singleton'的部分。 – SomeJavaGuy

+0

答案並不是說這樣的事情。私有構造函數僅僅是一種強制單例模式的方式。你只能在主課內進行欺騙。 – f1sh

+0

使構造函數'private'成爲實現單例模式所需要做的事情之一。但它不是唯一的,只是這本身並不會自動使它成爲單身。 – Jesper

回答

2

我們不能通過私有構造函數一次實例化多個對象。

不,我們可以。一個private構造函數只能避免在類之外創建實例。因此,您有責任決定應在哪些情況下創建新對象。

而正如預期的那樣,這兩個字符串正在打印。我錯過了什麼?

您每次調用getInstance方法時都會創建一個新實例。但是你的註釋代碼包含一個標準的單例模式的延遲初始化實現。取消註釋這些部分以查看差異。

您可以查看的其他單例實現here

1

私有構造函數用於阻止其他類創建包含私有構造函數的「類」對象。

這樣做是爲了提供只使用類的單個實例的單例模式。

您提到的代碼應該只創建該類的一個實例,並僅使用該實例來執行該類的所有操作。但是你修改了違反單例設計模式的代碼。

1

爲什麼我們需要一個私有構造函數?

基本上3個原因:

  1. ,如果你不希望類的用戶直接創建一個對象,而是使用製造商或同類者,

  2. 如果你有一個類只爲常量定義,那麼您需要封裝類,以便JVM在運行時不會爲您創建類的實例。

  3. 單身

相關問題