In Java sehe ich manchmal den Konstruktor als 'public' deklariert und manchmal hat es keinen Zugriffsmodifikator, was bedeutet, dass es package-privat ist. In welchen Fällen muss ich einen verwenden und umgekehrt?Wann sollte ein Konstruktor öffentlich werden und wann sollte er paket-privat sein?
Antwort
Modifikatoren gelten für Konstruktoren wie Felder und Methoden.
- Wenn es
public
ist, kann jede Klasse Zugang und sehen es. - Wenn es
private
ist, kann keine andere Klasse außerhalb dieser Klasse Zugriff oder siehe es.
Read more about access control at documentation
Allgemeinen Konstrukteure sind private
gemacht, wenn Sie Fabrik verwenden Muster oder Muster Singleton
Die Frage enthält die Antwort. Machen Sie den Konstruktor öffentlich, wenn Sie zulassen, dass Ihr Clientcode außerhalb des Pakets Ihr Objekt instanziiert. Wenn Sie dies nicht möchten (weil das Objekt paketspezifisch ist oder das Objekt selbst nicht direkt instanziiert werden kann), verwenden Sie package-private.
Zum Beispiel, wenn Sie einen Client-Code, der ein Car
(das ist eine Schnittstelle) und einig Paket com.company.cars
enthalten Klassen verwenden soll, die die Car
Schnittstelle implementiert (BMW, WV, Opel
) und so weiter, dann würden Sie eher eine Fabrik welches die notwendige Car-Implementierung instanziiert. Somit hätte nur die Fabrik Zugriff auf den Konstruktor.
public CarFactory {
public Car getCar(CarType carType) {
Car result = null;
switch(carType) {
case BMW:
result = new BMW();
case Opel:
result = new Opel();
}
return result;
}
}
class BMW implements Car {
// package-private constructor
BMW();
}
"Package private" (Standardzugang), trotz der Standard ist, ist selten eine gute andere Wahl, als auf äußere Klasse/Interface/Enum. Es wäre angemessen für eine abstrakte Klasse mit einem festen Satz von Unterklassen (im selben Paket), ein bisschen wie ein enum
Konstruktor in der gleichen enum. Wenn der äußere Typ Paket privat ist, können Sie öffentliche Konstruktoren und Mitglieder lieber öffentlich als einen exotischen Zugriffsmodifikator belassen.
Insbesondere siehe Abschnitt "Tipps zur Auswahl einer Zugriffsebene". – Raedwald
'private' Konstruktoren für das" Factory "-Muster? Sie meinen statische Factory [creation] -Methoden und nicht GoF Abstract Factory (normalerweise nur Fabrik genannt) und Factory Methods. –
@Tom ja Statisches Fabrikmuster –