In der objektorientierten Programmierung ist eine Java-Singleton-Klasse eine Klasse, die jeweils nur ein Objekt (eine Instanz der Klasse) haben kann. Wenn wir nach dem ersten Mal versuchen, die Java-Singleton-Klassen zu instanziieren, zeigt die neue Variable auch auf die erste erstellte Instanz. Welche Änderungen wir also über eine beliebige Instanz an einer Variablen innerhalb der Klasse vornehmen, wirkt sich auf die Variable der einzelnen erstellten Instanz aus und ist sichtbar, wenn wir über eine Variable dieses definierten Klassentyps auf diese Variable zugreifen.
Denken Sie beim Definieren einer Klasse als Singleton-Klasse, also beim Entwerfen einer Singleton-Klasse, an die wichtigsten Punkte:
- Machen Sie einen Konstruktor privat.
- Schreiben Sie eine statische Methode mit dem Rückgabetypobjekt dieser Singleton-Klasse. Hier wird das Konzept der verzögerten Initialisierung verwendet, um diese statische Methode zu schreiben.
Zweck der Singleton-Klasse
Der Hauptzweck einer Java-Singleton-Klasse besteht darin, die Anzahl der Objekterstellungen auf nur eine zu beschränken. Dadurch wird häufig eine Zugriffskontrolle auf Ressourcen, beispielsweise Socket- oder Datenbankverbindungen, sichergestellt.
Bei der Verwendung der Singleton-Klasse kommt es nicht zu einer Verschwendung von Speicherplatz, da dadurch die Instanzerstellung eingeschränkt wird. Da die Objekterstellung nur einmal erfolgt, anstatt sie bei jeder neuen Anfrage zu erstellen.
Wir können dieses einzelne Objekt je nach Anforderungen wiederholt verwenden. Aus diesem Grund nutzen Multithread- und Datenbankanwendungen meist das Singleton-Muster in Java für Caching, Protokollierung, Thread-Pooling, Konfigurationseinstellungen und vieles mehr.
der die Schule geschaffen hat
Wenn wir beispielsweise eine Lizenz haben und nur eine Datenbankverbindung haben oder wenn unser JDBC-Treiber kein Multithreading zulässt, dann kommt die Singleton-Klasse ins Spiel und sorgt dafür, dass zu einem Zeitpunkt nur eine einzige Verbindung besteht oder ein einzelner Thread kann auf die Verbindung zugreifen.
Wie entwerfe/erstelle ich eine Singleton-Klasse in Java?
Um eine Singleton-Klasse zu erstellen, müssen wir die folgenden Schritte ausführen:
1. Stellen Sie sicher, dass nur eine Instanz der Klasse vorhanden ist.
2. Gewähren Sie globalen Zugriff auf diese Instanz durch
- Alle Konstruktoren der Klasse als privat deklarieren.
- Bereitstellung einer statischen Methode, die einen Verweis auf die Instanz zurückgibt. Zum Schreiben der statischen Methoden wird das Konzept der verzögerten Initialisierung verwendet.
- Die Instanz wird als private statische Variable gespeichert.
Ein Beispiel für Singleton-Klassen ist Laufzeitklasse, Aktionsservlet und Service Locator . Private Konstruktoren und Factory-Methoden sind ebenfalls ein Beispiel für die Singleton-Klasse.
Unterschied zwischen normaler Klasse und Singleton-Klasse
Wir können eine Singleton-Klasse von den üblichen Klassen hinsichtlich des Prozesses der Instanziierung des Objekts der Klasse unterscheiden. Um eine normale Klasse zu instanziieren, verwenden wir einen Java-Konstruktor. Um andererseits eine Singleton-Klasse zu instanziieren, verwenden wir die Methode getInstance().
Der andere Unterschied besteht darin, dass eine normale Klasse am Ende des Lebenszyklus der Anwendung verschwindet, während die Singleton-Klasse nicht mit dem Abschluss einer Anwendung zerstört wird.
Formen des Singleton-Klassenmusters
Es gibt zwei Formen von Singleton-Entwurfsmustern:
schnelles Sortieren von Java
- Frühe Instanziierung: Die Objekterstellung erfolgt zum Ladezeitpunkt.
- Faule Instanziierung: Die Objekterstellung erfolgt entsprechend der Anforderung.
Implementierung: Lassen Sie uns kurz erklären, wie sich die Singleton-Klasse von der normalen Klasse in Java unterscheidet. Hier liegt der Unterschied in der Instanziierung, da wir für normale Klassen einen Konstruktor verwenden, während wir für Singleton-Klassen den verwenden getInstance()-Methode was wir in Beispiel 1 näher betrachten werden, wie unten dargestellt. Um Verwirrung zu vermeiden, können wir bei der Definition dieser Methode im Allgemeinen auch den Klassennamen als Methodennamen verwenden, was im folgenden Beispiel 2 wie folgt dargestellt wird.
Beispiel 1:
Java
// Java program implementing Singleton class> // with using getInstance() method> // Class 1> // Helper class> class> Singleton {> > // Static variable reference of single_instance> > // of type Singleton> > private> static> Singleton single_instance => null> ;> > // Declaring a variable of type String> > public> String s;> > // Constructor> > // Here we will be creating private constructor> > // restricted to this class itself> > private> Singleton()> > {> > s => 'Hello I am a string part of Singleton class'> ;> > }> > // Static method> > // Static method to create instance of Singleton class> > public> static> synchronized> Singleton getInstance()> > {> > if> (single_instance ==> null> )> > single_instance => new> Singleton();> > return> single_instance;> > }> }> // Class 2> // Main class> class> GFG {> > // Main driver method> > public> static> void> main(String args[])> > {> > // Instantiating Singleton class with variable x> > Singleton x = Singleton.getInstance();> > // Instantiating Singleton class with variable y> > Singleton y = Singleton.getInstance();> > // Instantiating Singleton class with variable z> > Singleton z = Singleton.getInstance();> > // Printing the hash code for above variable as> > // declared> > System.out.println(> 'Hashcode of x is '> > + x.hashCode());> > System.out.println(> 'Hashcode of y is '> > + y.hashCode());> > System.out.println(> 'Hashcode of z is '> > + z.hashCode());> > // Condition check> > if> (x == y && y == z) {> > // Print statement> > System.out.println(> > 'Three objects point to the same memory location on the heap i.e, to the same object'> );> > }> > else> {> > // Print statement> > System.out.println(> > 'Three objects DO NOT point to the same memory location on the heap'> );> > }> > }> }> |
>
>Ausgabe
int in String Java umwandeln
Hashcode of x is 558638686 Hashcode of y is 558638686 Hashcode of z is 558638686 Three objects point to the same memory location on the heap i.e, to the same object>
Ausgabeerklärung:
In einer Singleton-Klasse, wenn wir zum ersten Mal aufrufen getInstance()-Methode erstellt ein Objekt der Klasse mit dem Namen single_instance und gibt es an die Variable zurück. Da single_instance statisch ist, wird es von null in ein Objekt geändert. Wenn wir das nächste Mal versuchen, die Methode getInstance() aufzurufen, da single_instance nicht null ist, wird sie an die Variable zurückgegeben, anstatt die Singleton-Klasse erneut zu instanziieren. Dieser Teil wird durch die if-Bedingung erledigt.
Drucken aus Java
In der Hauptklasse instanziieren wir die Singleton-Klasse mit den drei Objekten x, y und z, indem wir die statische Klasse aufrufen Methode getInstance() . Aber tatsächlich werden nach der Erstellung des Objekts x die Variablen y und z auf das Objekt x verwiesen, wie im Diagramm gezeigt. Wenn wir also die Variablen des Objekts x ändern, spiegelt sich dies wider, wenn wir auf die Variablen der Objekte y und z zugreifen. Auch wenn wir die Variablen des Objekts z ändern, spiegelt sich dies wider, wenn wir auf die Variablen der Objekte x und y zugreifen.
Jetzt sind wir damit fertig, alle Aspekte von Beispiel 1 abzudecken und haben dasselbe implementiert. Jetzt implementieren wir die Singleton-Klasse mit dem Methodennamen, der dem Klassennamen entspricht.
Beispiel 2:
Java
// Java program implementing Singleton class> // with method name as that of class> // Class 1> // Helper class> class> Singleton {> > // Static variable single_instance of type Singleton> > private> static> Singleton single_instance => null> ;> > // Declaring a variable of type String> > public> String s;> > // Constructor of this class> > // Here private constructor is used to> > // restricted to this class itself> > private> Singleton()> > {> > s => 'Hello I am a string part of Singleton class'> ;> > }> > // Method> > // Static method to create instance of Singleton class> > public> static> Singleton Singleton()> > {> > // To ensure only one instance is created> > if> (single_instance ==> null> ) {> > single_instance => new> Singleton();> > }> > return> single_instance;> > }> }> // Class 2> // Main class> class> GFG {> > // Main driver method> > public> static> void> main(String args[])> > {> > // Instantiating Singleton class with variable x> > Singleton x = Singleton.Singleton();> > // Instantiating Singleton class with variable y> > Singleton y = Singleton.Singleton();> > // instantiating Singleton class with variable z> > Singleton z = Singleton.Singleton();> > // Now changing variable of instance x> > // via toUpperCase() method> > x.s = (x.s).toUpperCase();> > // Print and display commands> > System.out.println(> 'String from x is '> + x.s);> > System.out.println(> 'String from y is '> + y.s);> > System.out.println(> 'String from z is '> + z.s);> > System.out.println(> '
'> );> > // Now again changing variable of instance z> > z.s = (z.s).toLowerCase();> > System.out.println(> 'String from x is '> + x.s);> > System.out.println(> 'String from y is '> + y.s);> > System.out.println(> 'String from z is '> + z.s);> > }> }> |
>
>Ausgabe
So deaktivieren Sie den Entwicklermodus in Android
String from x is HELLO I AM A STRING PART OF SINGLETON CLASS String from y is HELLO I AM A STRING PART OF SINGLETON CLASS String from z is HELLO I AM A STRING PART OF SINGLETON CLASS String from x is hello i am a string part of singleton class String from y is hello i am a string part of singleton class String from z is hello i am a string part of singleton class>
Erläuterung: Wenn wir in der Singleton-Klasse die Singleton()-Methode zum ersten Mal aufrufen, erstellt sie ein Objekt der Klasse Singleton mit dem Namen single_instance und gibt es an die Variable zurück. Da single_instance statisch ist, wird es von null in ein Objekt geändert. Wenn wir das nächste Mal versuchen, die Singleton()-Methode aufzurufen, wird single_instance an die Variable zurückgegeben, da single_instance nicht null ist, anstatt die Singleton-Klasse erneut zu instanziieren.
Lesen Sie weiter: Tutorial zu Java-Designmustern