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.
@TheLostMind Ich nenne das eine Utility-Klasse, wie am Ende erwähnt. Ich bevorzuge eine 'enum', die einen privaten Konstruktor hat. –
Und Enums verwenden wäre der richtige Weg, es zu tun :) – TheLostMind