2016-04-10 124 views
1

例如一類:Java:爲什麼構造函數具有訪問修飾符?

//class1 
class A { 
    private A() { } // why would I make it private? 
    public A(int) { } //why isn't it implicitly public? 
} 
//class2 
class B { 

    public static void main(String[] args) { 
     //A a = new A(); 
    } 
} 

構造函數實例化一個類,所以爲什麼它的訪問修飾符? 有沒有這種情況,我們必須申報構造函數私人

回答

5

構造函數實例化一個類,爲什麼它具有訪問修飾符?

修飾符可以用來控制對象的構建位置。

有沒有必要聲明構造函數爲私有的情況?

假設你有一個像

class A { 
    private A(int n) { } 

    public static A create(int n) { 
     return new A(n); 
    } 
} 

工廠方法,或者你有一個共同的構造應直接調用。

class B { 
    public B(int n) { 
     this(n, ""); 
    } 
    public B(String str) { 
     this(0, str); 
    } 
    private B(int n, String str) { } 
} 

,或者你有一個Singleton

final class Singleton { 
    Singleton INSTANCE = new Singleton(); 
    private Singleton() { } 
} 

但我更喜歡使用enum具有private構造。

enum Singleton { 
    INSTANCE; 
} 

,或者你有一個實用工具類

final class Utils { 
    private Utils() { /* don't create one */ } 

    public static int method(int n) { } 
} 

但我更喜歡使用一個枚舉在這種情況下

enum Utils { 
    /* no instances */; 

    public static int method(int n) { } 
} 

注:如果您在final類使用私有構造函數仍然可以使用嵌套類或反射來創建實例。如果您使用enum,則無法輕鬆/意外地創建實例。

警告:您可以使用Unsafe


注意在enum構造必須創建一個enum的情況下private

class BuySell { 
    BUY(+1), SELL(-1); 

    private BuySell(int dir) { } 
} 

你不必讓它private明確,因爲這是默認值。

+1

@TheLostMind我稱之爲實用程序類,如最後所述。我更喜歡使用具有私有構造函數的'enum'。 –

+1

並使用枚舉將是正確的方式來做到這一點:) – TheLostMind

1

應用於構造函數時的私有修飾符的工作方式與應用於常規方法甚至實例變量的方式大致相同。使用private修飾符定義一個構造函數表示只允許本地類(如在定義了私有構造函數的類中)創建該類的實例,並且不允許其他調用者這樣做。有兩種可能的原因是爲什麼要使用一個私有構造函數 - 第一個原因是你不希望你的類的任何對象被創建,第二個原因是你只希望在內部創建對象 - 作爲只在你的班級中創建。私人construtor的

用途: -
1)私有的構造可以在Singleton設計模式使用
2)私有的構造可以防止物體的創建

這也可能有助於Can a constructor in Java be private?使用私人構造函數案例

0

構造函數不負責創建的Class,這些構造函數只是負責任的e僅適用於initialize成員變量。

背後有各種各樣的原因。背後最常見的原因之一是design-Pattern

//class1 
class A { 
    private A() { } // why would I make it private? 

} 

爲什麼讓私有構造?

如果你想創建一個類singleton那麼你的構造函數必須是private。那麼只有有可能將一個Class作爲一個Singleton。

相關問題