Wie erstelle ich Singleton in Java? Arten von Initialisierung, Vergleich und zu beachtende Punkte

Veröffentlicht: 2020-10-07

Eine Singleton-Klasse ist in Java als diejenige Klasse definiert, die nur ein Objekt hat, dh nur eine Instanz der Klasse. Die Beschränkung der Instanz auf nur eine pro Klasse hilft beim Codieren bestimmter Programme, die nur eine Instanz der Klasse benötigen. Die einzige Instanz einer Singleton-Klasse erhält einen globalen Zugriffspunkt.

Die Singleton-Klasse ist eines der wichtigsten Entwurfsmuster in der Java-Programmierung. Singleton-Klassen helfen dabei, Ressourcen zu begrenzen und zu optimieren; Es wird häufig in Datenbankverbindungen oder Sockets verwendet. Es gibt Implementierungssyntaxen für Singleton-Klassen, und ein guter Entwickler muss darüber Bescheid wissen. Sehen wir uns die Implementierung der Singleton-Klasse in Java an.

Lernen Sie Software Engineer-Programme online von den besten Universitäten der Welt. Verdienen Sie Executive PG-Programme, Advanced Certificate-Programme oder Master-Programme, um Ihre Karriere zu beschleunigen.

Lesen Sie: Java-Architektur und -Komponenten erklärt

Inhaltsverzeichnis

Initialisierung

Die Initialisierung eines Singletons in Java erfolgt über einen privaten Konstruktor. Private Konstruktoren helfen in anderen Klassen, nicht in der Lage zu sein, dieselbe Instanz wie Ihre Singleton-Klasse zu erstellen. Es gibt fünf Arten der Initialisierung der Singleton-Klasse in Java, die unten aufgeführt sind:

1. Eifrige Initialisierung

Eine allgemein als getInstance() bezeichnete öffentliche Methode wird erstellt. Diese Methode hilft dabei, nur einen Einstiegspunkt zum Erstellen einer Instanz der Klasse bereitzustellen, wodurch sie zu einer Singleton-Klasse wird. Die Instanz der Klasse in der eifrigen Initialisierung wird zum Zeitpunkt des Ladens der Klasse erstellt.

Diese Art der Initialisierungstechnik erstellt die Instanz der Klasse automatisch, auch wenn der Benutzer sie nicht verwendet. Dies kann zu Speicherproblemen und unnötiger Codelänge führen. Um dem Speicherleckproblem entgegenzuwirken, sehen wir uns eine andere Art von Initialisierungstechnik für eine Singleton-Klasse in Java an.

2. Verzögerte Initialisierung

Die Instanz der Klasse wird in der Methode getInstance() selbst in Lazy Initialization initialisiert. Die Methode in der verzögerten Initialisierung prüft, ob die Instanz der Klasse erstellt wird oder nicht, und wenn sie nicht erstellt wird, erstellt sie nur eine Instanz, wodurch das Problem des Speicherlecks gelöst wird.

Die Methode, die man bei der verzögerten Initialisierung erstellt, ist statisch und hat ein Rückgabetypobjekt. Die Singleton-Instanz in der verzögerten Initialisierung wird erst erstellt, wenn die Methode getInstance() zum ersten Mal aufgerufen wird.

3. Lazy Initialisierung mit Double-Lock-Methode

Diese Methode wird zum Zeitpunkt von mehr als einem Thread verwendet. Wenn wir zwei Threads im Programm verwenden und auf beide über die 'if'-Anweisung zugegriffen werden kann, wenn die Instanz null ist, wird dies zu einer Konfliktsituation führen und Sie können Fehler finden.

Dieses Problem wird durch das Double-Lock-Verfahren gelöst, bei dem immer nur ein Thread in den synchronisierten Block zur Initialisierung der Instanz eintritt, während der andere Thread blockiert wird. Wenn der erste Thread den synchronisierten Block verlässt, tritt nur der zweite Thread ein und erstellt eine weitere Instanz. Standardmäßig überprüft der zweite Thread nicht, ob die Instanz nicht null ist oder nicht.

4. Lazy-Load-Methode

In dieser Methode wird eine verschachtelte innere Klasse erstellt, die nach den Prinzipien von JLS (Java Language Specifications) arbeitet. Es gäbe keine statischen Datenmember in der Klasse; JVM erstellt keine Instanz der Klasse. Die Instanz würde nur bei Bedarf erstellt, wenn wir die Methode getInstance() aufrufen.

Sie müssen die Methode für die Initialisierung und das Laden nicht synchronisieren, da diese Methode bei der automatischen Synchronisierung aller Aufrufe zum Abrufen von Instance () hilft.

5. Enums-Methode

Mehrere Instanzen einer Singleton-Klasse können weiterhin durch Serialisierung und Reflektion in den oben genannten Methoden erstellt werden. Im Fall der Erstellung einer strikten Singleton-Klasse kann diese Methode verwendet werden. Enums-Felder werden in dieser Methode verwendet, die eine Konstante ist und nur zur Kompilierzeit ausgeführt wird.

Ein Enum ist die Instanz des Enum-Typs und wird nur erstellt, wenn der Enum-Typ zum ersten Mal im Code aufgerufen/aufgerufen wird. Diese Methode schränkt das Klonen von Instanzen ein und macht eine perfekte Singleton-Klasse.

Lesen Sie auch: Top 12 Pattern-Programme in Java, die Sie heute auschecken sollten

Serialisierung & Reflexion

Die Serialisierung hilft beim Transport von Java-Objekten von einer JVM (Java Virtual Machine) zu einer anderen. Die Serialisierung ist eine der Methoden zum Erstellen mehrerer Instanzen einer Klasse. Die Serialisierung wandelt das Objekt in einen Bytestrom um, und dann erfolgt die Übertragung.

Der Bytestrom hilft bei der Neuerstellung des Objekts in einer anderen JVM mithilfe des Deserialisierungsprozesses. Es hilft mehreren Systemen zu kommunizieren und Objekte untereinander zu teilen. Es hilft bei der Cross-JVM-Synchronisation, da die Objekte in verschiedenen JVMs funktionieren.

Reflection ist auch eine Methode zum Klonen von Objekten in Java. Reflection ist eine API, die uns hilft, die Klasse von unbekannten Objekten und Methoden dieser bestimmten Klasse zu kennen, auf die über das Objekt zugegriffen werden kann. Reflektion wird von Programmierern häufig verwendet, um das Verhalten von Klassen und Methoden zur Laufzeit zu ändern.

Die drei Hauptbefehle, die bei der Reflektion verwendet werden, sind getClass(), um die Klasse zu kennen, zu der das Objekt gehört, getConstructors(), um die öffentlichen Konstruktoren der Klasse des Objekts zu erhalten, getMethods(), um die öffentlichen Methoden der beobachteten Klasse zu kennen.

Normale Klasse vs. Singleton-Klasse

Eine Standardklasse in Java verwendet Konstruktoren, um sich selbst zu initialisieren, während wir die Methode getInstance() verwenden, um eine Singleton-Klasse zu initialisieren. Wir können auch denselben Klassen- und Methodennamen verwenden. Wir erstellen zuerst ein Objekt für normale Klassen und verwenden dann seine Methoden und Eigenschaften.

Im Gegensatz dazu erstellen wir in einer Singleton-Klasse eine Instanz unter Verwendung der statischen Eigenschaft der Klasse, und an jedem Punkt des Codes gibt diese bestimmte Klasse nur eine einzelne Instanz zurück.

Neben vielen Vorteilen von Singleton-Klassen gibt es auch einige Schlupflöcher wie Singleton-Klassen manipulieren Unit-Testing-Methoden, wenn die Objekte und Methoden eng gekoppelt sind. In diesem Fall müssen Sie einem Singleton eine voll funktionsfähige Klasse zuweisen.

Versteckte Abhängigkeiten werden manchmal auch von Singleton-Klassen erstellt, da die Referenz der Singleton-Klasse an andere Methoden weitergegeben wird und nicht vollständig transparent ist, was es für Programmierer/Entwickler schwierig macht, die Methoden und Klassen im Auge zu behalten. Man sollte diese Mängel im Hinterkopf behalten, bevor man ein Singleton-Muster erstellt, und sollte versuchen, sie zu minimieren.

Punkte, um eine perfekte Singleton-Klasse zu erstellen

1. Die Punkte, die konzentriert werden sollten, um eine perfekte Singleton-Klasse zu erstellen, sind wie folgt:

2. Wenn Sie mehrere Threads in einer Singleton-Klasse erstellen, stellen Sie sicher, dass nicht alle Threads die Singleton-Klasse gleichzeitig initialisieren. Man sollte versuchen, Thread-sichere Singleton-Klassen zu erstellen.

3. Machen Sie Ihre Singleton-Klasse reflexionssicher, indem Sie die Sichtbarkeit des Konstruktors zur Laufzeit für die Öffentlichkeit ändern und sicherstellen, dass es nur eine Instanz einer bestimmten Singleton-Klasse gibt.

4. Wenn es mehrere Threads gibt, können Sie einen flüchtigen Modifikator verwenden, der verhindert, dass ein Thread den initialisierten Zustand anderer Threads betrachtet. Ein flüchtiger Modifikator arbeitet an der Happens-Before-Beziehung, in der das Schreiben in einem Thread erfolgt, bevor ein anderer Thread es lesen kann.

Muss gelesen werden: Interessante Java-Projektideen für Anfänger

Fazit

Singleton-Klassen werden verwendet, um benutzerdefinierte Verbindungen zur Datenbank oder zu einem beliebigen Programm herzustellen, in dem Sie die Methoden und Instanzen der Klasse steuern möchten.

Wenn Sie Ihre Java-Kenntnisse verbessern möchten, müssen Sie diese Java-Projekte in die Hände bekommen. Wenn Sie mehr über Java und Full-Stack-Entwicklung erfahren möchten, schauen Sie sich das Executive PG-Programm in Softwareentwicklung von upGrad & IIIT-B an - Spezialisierung auf Full-Stack-Entwicklung , das für Berufstätige konzipiert ist und mehr als 500 Stunden strenges Training bietet, 9 + Projekte und Aufgaben, IIIT-B-Alumni-Status, praktische praktische Abschlussprojekte und Jobunterstützung bei Top-Unternehmen.

Werden Sie Full-Stack-Entwickler

Bewerben Sie sich für den Master of Science in Informatik