Einführung in die Singleton-Klasse in Java
Die Singleton-Klasse beschränkt die Objekterstellung für eine Klasse auf nur eine in der Java Virtual Machine. Es hilft auch bei der Bereitstellung eines globalen Zugriffspunkts auf das Objekt. Dieses Entwurfsmuster wird häufig für Caching, Abstract Factory, Protokollierung, Prototype usw. verwendet. Es wird auch in Java-Kernklassen wie java.awt.Desktop, java.lang.Runtime verwendet. In java.lang.Runtime stellt Java eine Klassenlaufzeit bereit, die die aktuelle Laufzeitumgebung angibt, in der die Anwendung ausgeführt wird. Dies erleichtert die Anbindung der Anwendung und der Laufzeitumgebung. Es sollte ein Objekt geben, da die JRE eindeutig ist. In java.awt.Desktop ermöglicht die Klasse Desktop, dass Anwendungen einen URI oder eine Datei mit dem Standardbrowser des Benutzers, Mail-Clients usw. starten. Auch hier darf es nur eine Instanz der Klasse geben.
Funktionsweise von Singleton Class in Java
Singleton-Klasse kann auf zwei Arten erstellt werden.
- Setzen Sie den Konstruktor auf privat, um die Erstellung eines Objekts einzuschränken.
- Erstellen Sie eine statische Methode, um eine Instanz des Objekts abzurufen, sodass Sie die Erstellung des Objekts nur innerhalb der Klasse durchführen können.
Sehen wir uns nun das Class UML-Diagramm (Unified Modeling Language) der Singleton-Klasse an.
Im UML-Klassendiagramm steht die erste Partition für den Namen einer Klasse, die zweite Partition für die Attribute und die dritte Partition für die Methoden. Außerdem kennzeichnet + öffentliche Attribute oder Methoden und - private Attribute oder Methoden. In unserem UML-Diagramm der Singleton-Klasse lautet der Klassenname Singleton und es gibt eine Hauptmethode. Hauptmethode, getInstance-Methode und sampleMethod sind die einzigen Methoden, die im obigen Diagramm öffentlich sind. Konstruktor- und Instanzattribut werden im Rahmen unserer Implementierung als privat festgelegt. Diese öffentliche Main-Methode fordert die Instanz an und getInstance gibt sie an die main-Methode zurück.
Basierend auf Instantiation besteht der einzige Unterschied zwischen der normalen Java-Klasse und der Singleton-Klasse darin, dass wir in der Java-Klasse einen Konstruktor verwenden, während wir in Singleton die Methode getInstance () verwenden.
Das Singleton-Entwurfsmuster hat zwei Formen.
- Lazy Instantiation: Instanzerstellung bei Bedarf
- Early Instantiation: Instanzerstellung zum Ladezeitpunkt.
1. Lazy Instantiation
In Lazy Instantiation wird eine Klasseninstanz erstellt, wenn dies erforderlich ist. Es wird in der synchronisierten Methode oder im synchronisierten Block erstellt, um die Race-Bedingungen zu vermeiden, die in einer Umgebung mit mehreren Threads auftreten können.
2. Frühe Instanziierung
In Early Instantiation wird zum Ladezeitpunkt eine Instanz erstellt. Obwohl dies der einfachste Ansatz ist, hat er den Nachteil, dass die Instanzerstellung unabhängig davon erfolgt, ob darauf zugegriffen wird oder nicht.
Ein Beispiel für Lazy Instantiation und Early Instantiation wird im folgenden Abschnitt erläutert.
Implementierung der Singleton-Klasse in Java
Wie oben erläutert, kann die Singleton-Klasse in Early Instantiation oder Lazy Instantiation erstellt werden.
Lazy Instantiation
Es folgen die Schritte zum Implementieren der Lazy Instantiation
1. Setzen Sie den Konstruktor auf privat.
Zum Beispiel erstellen wir eine Klasse LazyClass. Der Konstruktor sieht wie folgt aus.
private LazyClass ()
(
)
2. Erstellen Sie eine private statische Instanz für die erstellte Klasse.
private static LazyClass instance;
3. Erstellen Sie eine statische synchronisierte Methode, mit der die Klasseninstanz erstellt wird.
public static synchronized LazyClass getInstance()
(
)
4. Überprüfen Sie zunächst in der Methode getInstance (), ob eine Instanz vorhanden ist oder nicht. Wenn nicht gefunden, erstellen Sie eine. Anderenfalls geben Sie die Instanz zurück.
if(instance == null)
(
instance = new LazyClass ();
)
return instance;
Lassen Sie uns dies nun anhand von Beispielcode untersuchen.
//Java Program for Lazy Instantiation
public class LazyClass (
private static LazyClass instance;
//set the constructor as private
private LazyClass () ()
//Checks whether an instance is already in the getInstance method
public static synchronized LazyClass getInstance() (
//if instance is not present already, create a new one
if(instance == null) (
instance = new LazyClass ();
)
// if an instance is present, then return it
return instance;
)
//Sample method that is protected from more than one object creation
public void sampleMethod( ) (
System.out.println("sampleMethod for lazy singleton");
)
public static void main(String() args) (
LazyClass temp=LazyClass.getInstance();
temp.sampleMethod();
)
)
Ausgabe:
Anstatt eine Instanz zum Ladezeitpunkt zu erstellen, wird sie hier innerhalb des synchronisierten Blocks erstellt. Zum besseren Verständnis wird auch eine Beispielmethode angegeben, die vor mehr als einer Objekterstellung geschützt ist.
Frühe Instanziierung
Lassen Sie uns nun die Schritte für die frühe Instanziierung sehen. Es ähnelt der verzögerten Instanziierung, verwendet jedoch keine synchronisierte Methode oder keinen synchronisierten Block.
1. Setzen Sie den Konstruktor auf privat.
Zum Beispiel erstellen wir eine Klasse EarlyClass. Der Konstruktor sieht wie folgt aus.
private EarlyClass () ()
(
)
2. Erstellen Sie eine private statische Instanz für die erstellte Klasse.
private static EarlyClass ins = new EarlyClass();
3. Erstellen Sie eine statische Methode, mit der die Klasseninstanz erstellt wird.
public static EarlyClass getInstance()
(
)
Es folgt der Beispielcode für Early Instantiation.
//Java Program for Early Instantiation
public class EarlyClass (
//Create an instance of the class at load time
private static EarlyClass ins = new EarlyClass();
//set the constructor as private
private EarlyClass () ()
//A static method to get the instance
public static EarlyClass getInstance() (
return ins ;
)
//A sample method that is protected from more than one object creation
public void sampleMethod() (
System. out .println("sampleMethod for Early singleton");
)
//Main method
public static void main(String() args) (
EarlyClass tmp = getInstance ();
tmp.sampleMethod();
)
)
Ausgabe:
Im obigen Programm wird eine Instanz in Ladezeit erstellt und mit der Methode getInstance () zurückgegeben. Darüber hinaus wird Constructor im Rahmen der Singleton-Instanziierung als privat festgelegt.
Das Einsparen von Speicher ist der Hauptvorteil dieser Funktion, da ein Objekt wiederverwendet und nicht immer wieder erstellt wird.
Fazit
In diesem Dokument haben wir beschrieben, wie eine Singleton-Klasse mit Hilfe von UML-Klassendiagrammen, Algorithmen und Beispielcode funktioniert. Die Singleton-Klasse wird verwendet, wenn wir nur ein Objekt für eine Klasse und einen globalen Zugriffspunkt auf dieses Objekt benötigen. Die beiden Formen wie Early Instantiation und Lazy Instantiation können je nach Anforderung verwendet werden.
Empfohlene Artikel
Dies ist eine Anleitung zur Singleton-Klasse in Java. Hier diskutieren wir, wie die Singleton-Klasse in Java zusammen mit der Implementierung funktioniert, die die verzögerte Instanziierung und die frühe Instanziierung umfasst. Sie können auch unsere anderen Artikelvorschläge durchgehen, um mehr zu erfahren -
- Was ist Design Pattern in Java?
- Abstrakte Klasse in Java
- Java-Anmerkungen
- BorderLayout in Java
- JRE vs JVM | Top 8 Unterschiede zu (Infografiken)
- Wie funktioniert die statische Methode in JavaScript?