Ich brauche manchmal Klassen, die nur einmal während des Lebenszyklus der Anwendung instanziiert werden sollten. Das Erstellen von Singletons ist schlecht, weil dann das Komponententesten problematisch wird.Wie wird ein Beinahe-Singleton implementiert?
Aber da es eine einzige Instanz solcher Objekte während des Lebenszyklus meiner Anwendung geben sollte, wäre es ein Fehler, ein solches Objekt zweimal zu instanziieren , wenn die Anwendung ausgeführt wird.
Daher würde ich meine App gefällt, sobald eine Ausnahme zu werfen, wie es während seines Lebenszyklus feststellt, dass ein solches Objekt instanziiert wird zweimal während noch mehrere Instanziierung eines solchen Objekts, während Unit-Tests ermöglicht.
Ich denke, es ist keine unzumutbare Anforderung: Wenn während eines Lebenszyklus der Anwendung nur ein solches Objekt erstellt werden sollte, scheint es eine gute Sache zu sein, eine Ausnahme zu werfen.
Hier ist, was ich tue:
/**
* The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
* "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
* document are to be interpreted as described in RFC 2119.
*
* You MUST NOT instantiate this class more than once during the application's
* lifecycle. If you try to do so, an exception SHALL be thrown.
*
* You SHOULD be able to instantiate this class more than once when unit
* testing.
*
*
*/
public class LifeCycle {
private static final AtomicInteger cnt = new AtomicInteger(0);
@NotNull
public static LifeCycle getNewLifeCycle() {
if (cnt.incrementAndGet() > 1 && App.isRealApp()) {
throw new IllegalStateException("Class is already instantiated");
}
return new LifeCycle();
}
}
wo App.isRealApp() wird immer falsche zurück, wenn ich Unit-Tests sind und immer wahr, wenn die reale App läuft.
Meine Frage ist einfach: macht es Sinn und wie soll ich das umsetzen?
+1, Ich mag die leichte Proxy-Idee! – NoozNooz42
Es hat für mich funktioniert - und ich konnte die Codebasis so halten, wie sie war. –