Apps für Android programmieren leicht gemacht!

X.2 Singleton

Wie stellen wir sicher, dass es von einer Klasse immer nur ein Objekt gibt, egal wie groß und komplex ein Programm sein mag?

Die Antwort schimpft sich Singleton. Diese Klasse oder eben dieses Objekt kann immer nur einmal erstellt werden und egal wie oft wir es an wie vielen Stellen auch immer verwenden. Beim Singleton handelt es sich um ein sogenanntes Entwurfsmuster, auch Design Pattern genannt. Es handelt sich also nicht explizit um eine Implementierung, sondern lediglich um eine Idee, wie wir etwas programmieren könnten, um bestimmte Probleme zu lösen.

Verwendungszweck

Ein Singleton verwenden wir immer dort, wo es nur ein Objekt einer bestimmten Klasse geben darf. Gut, dass habe ich oben bereits beschrieben, aber warum muss man so etwas tun?
Die Antwort ist relativ einfach, wenn auch nicht ganz trivial. Ich versuche es einmal so simpel, wie möglich auszudrücken.

Stellt euch vor, ihr wollt Outputs eines Programmes in eine Textdatei speichern. In der Regel öffnen wir hier die Textdatei, speichern den Inhalt im Zwischenspeicher unter, hängen unseren Text an und speichern die Textdatei wieder. Das Ganze passiert rasend schnell.
Was passiert aber, wenn unser Programm an 2 Stellen Text in die selbe Datei schreiben will?
Die erste Stelle öffnet die Datei. Die zweite Stelle öffnet die Datei ebenfalls mit selbigem Inhalt. Die erste Stelle hängt nun den Text an und speichert die Datei. Die zweite Stelle tut dies kurz danach ebenfalls, aber mit der Zwischenversion der Textdatei, die den zusätzlichen Text von Stelle 1 noch nicht enthält. Nun haben wir mit Stelle 2 den zusätzlichen Text von Stelle 1 ignoriert/überschrieben.

Gleiches könnte passieren, wenn wir Daten ins Netz schicken und eine Antwort erwarten. Wenn zwei Programmstellen gleichzeitig Daten senden, kann es passieren, dass sich die Anfragen ans Netz in die Quere kommen.

Um es zusammenzufassen:
Singleton sind immer dann nötig, wenn wir Thread-Safe arbeiten müssen/wollen. Wenn sich also keine selbige Aufgabe auf zwei Threads in die Quere kommen darf.

 

Implementierung Java

Genug der Theorie. Wie implementieren wir unser Entwurfsmuster?

public class Singleton { 
   private static final Singleton objekt;
      
   private Singleton() { 
      System.out.println("Objekt erstellt..."); 
   } 
           
   public static Singleton getInstance() { 
      if(objekt == null){
         objekt = new Singleton(); 
      }
      return objekt; 
   } 

   public void ausfuehren(){
      // Führe deine Aufgabe hier aus oder schreibe etwas in eine Wartechlange
   }
}

Nun haben wir bereits mit wenigen Zeilen Code ein Singleton implementiert.
Es gibt hier ein paar „Eigenheiten“ zu beachten.

  1. Der Constructor ist private, was bedeutet, dass wir nicht einfach in irgendeiner Klasse „new Singleton()“ ausführen können.
  2. Der Singleton enthält sich selber als static Variable.
  3. Die Methode „getInstance()“ liefert das instantiierte Objekt Singleton zurück oder erstellt eines.
  4. Führen wir „getInstance()“ aus, so erhalten wir immer das selbe Objekt zurück, auf welchem wir dann unsere Methoden ausführen können.
  5. All weiteren Methoden und Variablen des Singleton dürfen nicht mehr „static“ sein.

 

Verwendung

Wollen wir nun eine Aufgabe ausführen, so programmieren wir in einer ganz anderen Klasse:

Singleton s = Singleton.getInstance();
s.ausfuehren();

Damit ist es nun völlig egal wo und wann wir die Methode „ausfuehren()“ verwenden. Wir führen sie immer auf ein und dem selben Objekt in ein und dem selben Thread aus. Immer!

Für das Beispiel mit der Textdatei könnte man nun beispielsweise noch Array, als eine Art Warteschlange einführen, wodurch wir sicherstellen können, dass diese sequenziell abgearbeitet wird.

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Kommentar hinzufügen

*Pflichtfeld