Ich werde mit dem Java-Teil beginnen und wird eine zusätzliche Sache über hinzufügen, was @DavideLorenzoMARINO schrieb und das ist der volatile
keyword:
class MySingleton {
private static volatile MySingleton instance;
private MySingleton() {
// do what ever
}
public static MySingleton getInstance() {
if (MySingleton.instance == null) {
MySingleton.instance = new MySingleton();
}
return MySingleton.instance;
}
}
Wenn Sie wirklich sicherstellen möchten, dass dies in einer multi- arbeitet threaded Umgebung dann könnten Sie auch den „Double Checked Locking“ Ansatz berücksichtigen wollen:
class MySingleton {
private static volatile MySingleton instance;
private MySingleton() {
// do what ever
}
public static MySingleton getInstance() {
if (MySingleton.instance == null) {
synchronized (MySingleton.class) {
if (MySingleton.instance == null) {
MySingleton.instance = new MySingleton();
}
}
}
return MySingleton.instance;
}
}
Was das Typoskript Teil, ich glaube nicht, dass dieses Muster auch in Typoskript arbeitet als im Gegensatz zu Java zur Laufzeit nichts verhindern eine weitere develo per instanziieren mehr als eine Instanz.
Wenn Sie den Entwicklern vertrauen, die mit dem Code arbeiten, dann ist das in Ordnung, aber wenn nicht, warum umgibt man nicht einfach die Instanz in einem Modul/Namespace, so dass die Implementierung ausgeblendet wird?
Etwas wie:
namespace MySingleton {
class MySingletonInstance {
echo(value: string): string {
console.log(value);
return value;
}
}
export var instance = new MySingletonInstance();
}
Aber da Sie nur eine Instanz dieser Klasse werden mit, dann denke ich, dass in javascript es mehr Sinn macht überhaupt eine Klasse nicht zu verwenden, ist es nur Dinge machen Ausführlicher, und Sie können einfach:
namespace MySingleton {
export interface MySingletonInstance {
echo(value: string): string;
}
export var instance: MySingletonInstance = {
echo: value => {
console.log(value);
return value;
}
}
}
Aber was ist, wenn das Singleton in Multithreading-Umgebung (in Java) ist? Wird es abstürzen? –
Die statische Initialisierung ist threadsicher, dies ist von Design –
OK, danke. Kumpel. –