2016-04-10 3 views
1

Zum Beispiel eine Klasse:Java: Warum hat ein Konstruktor Zugriffsmodifizierer?

//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(); 
    } 
} 

instanziiert Ein Konstruktor eine Klasse so, warum es den Zugriffsmodifikator hat? Gibt es einen Fall, wenn wir einen Konstruktor privat deklarieren müssen?

Antwort

5

Ein Konstruktor instanziiert eine Klasse, also warum hat sie den Zugriffsmodifizierer?

Der Modifikator kann verwendet werden, damit Sie steuern, wo das Objekt erstellt werden kann.

Gibt es einen Fall, wenn wir einen Konstruktor privat deklarieren müssen?

Sagen Sie bitte eine Factory-Methode wie

haben
class A { 
    private A(int n) { } 

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

oder Sie haben einen gemeinsamen Konstruktor, die direkt aufgerufen werden soll.

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

oder Sie haben ein Singleton

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

aber ich ziehe einen enum zu verwenden, die einen private Konstruktor hat.

enum Singleton { 
    INSTANCE; 
} 

oder Sie haben eine Utility-Klasse

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

    public static int method(int n) { } 
} 

aber ich ziehe eine ENUM in diesem Fall

enum Utils { 
    /* no instances */; 

    public static int method(int n) { } 
} 

Hinweis zu verwenden: Wenn Sie einen privaten Konstruktor auf einer final-Klasse verwenden Sie kann weiterhin Instanzen mit verschachtelten Klassen oder Reflektionen erstellen. Wenn Sie eine enum verwenden, können Sie eine Instanz nicht so leicht/versehentlich erstellen.

Warnung: Sie können Instanzen eines enum erstellen Unsafe


Hinweis in enum mit der Konstruktor hat private

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

    private BuySell(int dir) { } 
} 

Sie haben noch sein, es zu machen private ausdrücklich als diese ist der Standardwert.

+1

@TheLostMind Ich nenne das eine Utility-Klasse, wie am Ende erwähnt. Ich bevorzuge eine 'enum', die einen privaten Konstruktor hat. –

+1

Und Enums verwenden wäre der richtige Weg, es zu tun :) – TheLostMind

1

Der private Modifikator, wenn er auf einen Konstruktor angewendet wird, funktioniert ähnlich wie bei einer normalen Methode oder sogar einer Instanzvariablen. Das Definieren eines Konstruktors mit dem privaten Modifizierer besagt, dass nur die native Klasse (wie in der Klasse, in der der private Konstruktor definiert ist) eine Instanz der Klasse erstellen darf und keinem anderen Aufrufer dies erlaubt ist. Es gibt zwei mögliche Gründe, warum man einen privaten Konstruktor verwenden möchte: Erstens wollen Sie überhaupt keine Objekte Ihrer Klasse erzeugen, und zweitens möchten Sie nur, dass Objekte intern erzeugt werden - als nur in Ihrer Klasse erstellt.

Nutzung des privaten construtor: -
1) Privatbauer kann
2) Privat Konstrukteuren Erstellung von Objekten in dem Singleton-Entwurfsmuster verwendet werden

Dies auch die Verwendung helfen könnte verhindern kann Can a constructor in Java be private? Fälle von privaten Konstrukteur

0

Konstruktor sind nicht verantwortlich für Erstellen eines object eines Class, diese Konstrukteure sind nur verantwortlich e für initialize nur die Mitgliedsvariablen.

Es gibt verschiedene Gründe dafür. Einer der beliebtesten Gründe dafür ist design-Pattern.

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

} 

, warum privaten Constructor machen?

Wenn Sie eine Klasse singleton erstellen möchten, muss Ihr Konstruktor private sein. dann ist es nur möglich, eine Klasse zu einem Singleton zu machen.

Verwandte Themen