2014-11-05 130 views
1

我已閱讀了許多網站上的私有構造函數,並且還提到了StackOverflow上的各種問題。但是,我不明白他們的用法。大多數網站都說當我們想限制可以創建的對象的實例數量時,可以使用私有構造函數使用私有構造函數創建類的對象

我嘗試了以下程序:

public class PrivateCons{ 
    private PrivateCons(){ 
    System.out.println("I'm executed"); 
    } 

    public static void main(String[] args) { 
     PrivateCons p=new PrivateCons(); 
     PrivateCons q=new PrivateCons(); 
    } 
} 

我的計劃執行得很好。我理解錯了嗎?

+1

你的主要方法是_inside_類具有私有的構造函數。所以只有你 - 作爲這個類的開發者 - 有權創建它的實例,並且因此可以將它們的數量限制爲你想要的數量。如果您將課堂作爲圖書館的一部分提供給我,那麼我不允許創建實例。這通常是提供靜態工廠方法的單例或類的概念。 – Seelenvirtuose 2014-11-05 07:53:12

+0

感謝您的解釋:) – Awani 2014-11-05 08:12:46

回答

2

Private字段是從類中訪問,您將無法訪問他們淘汰類,例如: -

class PrivateCons{ 
    private PrivateCons(){ 
    System.out.println("I'm executed"); 
    } 
} 

public class Test{ 
    public static void main(String[] args) { 
     PrivateCons p=new PrivateCons(); //this will fail- compiler error 
     PrivateCons q=new PrivateCons();//this will fail- compiler error 
    } 
} 

而且私有構造函數主要用於implementing Singleton Pattern,這是用來當該類的對象只有一個是必要的。以一個例子從鏈接本身維基百科的文章: -

public class singleton 
{ 
    private static singleton _obj; 

    private singleton() 
    { 
     // prevents instantiation from external entities 
    } 

    // Instead of creating new operator, declare a method 
    // and that will create object and return it. 

    public static singleton GetObject() 
    { 
     // Check if the instance is null, then it 
     // will create new one and return it. 
     // Otherwise it will return previous one. 

     if (_obj == null) 
     { 
      _obj = new singleton(); 
     } 

     return _obj; 
    } 

} 

您可以擴展這個例子,並限制你的對象,以2,3或任意數量的,或者換句話說restrciting你的類實例的數量。

+1

感謝您的幫助:) – Awani 2014-11-05 08:13:33

+0

請記住Singleton模式限制您的代碼。對於Singleton模式,由於UnitTests使用相同的實例,所以不能讓主構建和UnitTests並行。另外,當你想進行未來的調整時,比如有多個Singleton類的實例,這也會帶來問題。 (例如:我有一個類Anthill和一個Ant類,Anthill可以是一個Singleton,並且你有一堆Ant對象,假設將來我想擁有多個Anthill,現在不可能了完全更改代碼,因爲只有1個Anthil實例可以存在 – 2014-11-05 08:29:40

+0

是的,這是真的,但也有單一模式的有效用法,例如'java.lang.Runtime'使用Singleton模式。 – 2014-11-05 15:04:37

1

從同一個類中,您可以訪問私有構造函數。從其他類中,不能調用該構造函數。

您可以使用私有構造函數來實現Singleton設計模式。

public class PrivateCons 
{ 
    PrivateCons instance = new PrivateCons(); 
    private PrivateCons(){ 
    System.out.println("I'm executed"); 
    } 
    public static PrivateCons getInstance() 
    { 
     return instance; 
    } 
} 

現在,你的類的用戶只能得到你的類的一個實例,通過getIstnace方法,因爲他們無法通過私有構造函數創建新實例。

+0

這不是真正的最好的方式來創建單身...我會使用其他代碼示例.. – Frank 2014-11-05 07:52:07

+0

謝謝:)請問你怎麼會在這裏調用getInstance()方法。我嘗試了幾種方法,但他們給了我錯誤。 – Awani 2014-11-05 08:05:12

+0

@ user2195963這是一個靜態方法,所以你這樣調用它:'PrivateCons.getInstance()' – Eran 2014-11-05 08:06:32

1

私人構造函數不限制創建實例的號碼;它限制了,其中的構造函數可能會被調用。

它可以防止從頂級類的範圍之外調用構造函數(在本例中爲PrivateCons)。

0

請大家看看folloing例如:

public class ClassWithPrivateConstructor { 

private static final Random random = new Random(); 
private static final int count = 10; 
private static final ClassWithPrivateConstructor[] instances = new ClassWithPrivateConstructor[count]; 
static  
{ 
    for (int i = 0; i < count; i++) { 
     instances[i] = new ClassWithPrivateConstructor(); 
    } 
} 

public static ClassWithPrivateConstructor newInstance() { 
    return instances[random.nextInt(count)]; 
} 

private ClassWithPrivateConstructor() {   
} 
} 

測試類:

public class ClassWithPrivateConstructorTest { 
public static void main(String[] args) { 
    for(int i=0;i<20; ++i) { 
     System.out.println(ClassWithPrivateConstructor.newInstance()); 
    } 
} 
} 

輸出示例: ClassWithPrivateConstructor @ 14ae5a5 ClassWithPrivateConstructor @ 7f31245a ClassWithPrivateConstructor @ 7f31245a ClassWithPrivateConstructor @ 14ae5a5 ClassWithPrivateConstructor @ 6d6f6e28 ClassW ithPrivateConstructor @ 7f31245a ClassWithPrivateConstructor @ 14ae5a5 ClassWithPrivateConstructor @ 135fbaa4 ClassWithPrivateConstructor @ 6d6f6e28 ClassWithPrivateConstructor @ 45ee12a7 ClassWithPrivateConstructor @ 330bedb4 ClassWithPrivateConstructor @ 45ee12a7 ClassWithPrivateConstructor @ 7f31245a ClassWithPrivateConstructor @ 135fbaa4 ClassWithPrivateConstructor @ 14ae5a5 ClassWithPrivateConstructor @ 2503dbd3 ClassWithPrivateConstructor @ 6d6f6e28 ClassWithPrivateConstructor @ 4b67cf4d ClassWithPrivateConstructor @ 7ea987ac ClassWithPrivateConstructor @ 45ee12a7

正如你所看到的類實例的數量在這種情況下被限制在10

相關問題