# Verzögerte Initialisierung

In der Computer-Programmierung ist eine verzögerte Initialisierung ein Entwurfsmuster, das die Erstellung eines Objekts, die Berechnung eines Werts oder eines anderen teuren Prozesses erst dann erstellt, wenn es erstmals benötigt wird. Es ist eine Art verzögerte Auswertung, die sich speziell auf die Instanziierung von Objekten oder anderen Ressourcen bezieht.
Eine verzögerte Initialisierung wird erreicht, indem eine Zugriffs-Methode (eine Get-Methode einer Eigenschaft, auch Getter genannt) erweitert wird, um zu überprüfen, ob ein privates Mitglied (Member), das als Cache fungiert, bereits initialisiert wurde. Wenn dies der Fall ist, wird es sofort zurückgegeben. Wenn nicht, wird eine neue Instanz erstellt, in die Member-Variable eingefügt und just-in-time (JIT) zur ersten Verwendung an den Aufrufer zurückgegeben.
Wenn Objekte Eigenschaften haben, die selten verwendet werden, kann dies die Startgeschwindigkeit verbessern. Die durchschnittliche Programmausführung kann in Bezug auf Speicher (für die Bedingungs-Variablen) und Ausführungs-Zyklen (um sie zu überprüfen) etwas schlechter sein. Die Auswirkung auf die Objektinstanziierung wird zeitlich verteilt („amortisiert“) und verzögern nicht in die Startphase des Systems. Damit können die mittleren Antwortzeiten erheblich verbessert werden.
In Multithreading-Code muss der Zugriff auf verzögert-initialisierte Objekte und Status synchronisiert werden, um eine Wettlaufsituation (race condition) zu vermeiden.

## Die träge/verzögerte Fabrik („lazy factory“)

In einer Software-Entwurfsmuster-Ansicht (eng. „OOP View“) wird die verzögerte Initialisierung häufig zusammen mit einer Fabrikmethode (OOP Muster) verwendet. Dies kombiniert drei Ideen:
* Verwendung einer Fabrik-Methode zum Erstellen von Instanzen einer Klasse (factory method pattern)
* Speichern der Instanzen in einer Zuordnungstabelle und Zurückgeben derselben Instanz an jede Anforderung für eine Instanz mit denselben Parametern (Multiton-Muster)
* Verwenden der verzögerten Initialisierung zum Instanziieren des Objekts bei der ersten Anforderung (verzögertes Initialisierungsmuster)

## Beispiele
### ActionScript 3

Folgendes Beispiel zeigt eine Klasse mit verzögerter Initialisierung in ActionScript:
Anwendung:

### C

In C wird eine verzögerte Auswertung normalerweise in einer einzelnen Funktion oder einer einzelnen Quelldatei unter Verwendung statischer Variablen implementiert.
In einer Funktion:
Wenn man stattdessen eine einzelne Quelldatei verwendet, kann der Status von mehreren Funktionen gemeinsam genutzt werden, während er dennoch vor nicht zugehörigen/verwandten Funktionen verborgen bleibt.
fruit.h (Header-Datei):
fruit.c:
main.c:

### C#

In .Net-Framework 4.0 hat Microsoft eine Lazy Klasse inkludiert, mit der das Verzögertes-Laden durchgeführt werden kann. Unten finden Sie einen Dummy-Code, mit der Klasse Fruit verzögert geladen werden kann.
Hier ist ein Beispiel in C#.
Die Fruit Klasse selbst tut an dieser Stelle Nichts. Die Klassen-Variable _typesDictionary ist ein Dictionary/Map mit dem Fruit Instanzen nach typeName gespeichert werden.
Ein einfaches Beispiel für die verzögerte Initialisierung, mit der Ausnahme, dass hierfür eine Aufzählung für den Typ verwendet wird

### C++

Hier ein Beispiel in C++.

### Crystal

Ausgabe:

### Haxe

Beispiel in Haxe
Anwendung

### Java

Beispiel in Java.
Ausgabe

### JavaScript

Hier ist ein Beispiel in JavaScript.
Ausgabe

### PHP

Hier ist ein Beispiel für die verzögerte Initialisierung in PHP 7.4:

### Python

Hier ist ein Beispiel in Python.

### Ruby

Hier ist ein Beispiel in Ruby, wie ein Authentifizierungs-Token von einem Remote-Dienst wie Google verzögert initialisiert werid. Die Art wie @auth_token zwischengespeichert wird, ist auch ein Beispiel für die Memoisierung.

### Scala

Scala verfügt über eine integrierte Unterstützung für die verzögerte Initiierung von Variablen.

### Smalltalk

Hier ist ein Beispiel für eine typische Zugriffs-Methode in Smalltalk, um den Wert einer Variable durch Nutzung von verzögertes Initialisieren zurückzuliefern.
Die 'nicht-verzögerte' Alternative besteht darin, eine Initialisierungs-Methode zu verwenden, die beim Erstellen des Objekts ausgeführt wird, und dann eine einfachere Zugriffsmethode zum Abrufen des Werts zu verwenden.
Beachten Sie, dass die verzögerte Initialisierung auch in nicht-objektorientierte Sprachen verwendet werden kann.

## Theoretische Informatik

Auf dem Gebiet der theoretischen Informatik ist die verzögerte Initialisierung (auch als verzögertes Array bezeichnet) eine Technik zum Entwerfen von Datenstrukturen, die mit Speicher arbeiten können, welcher nicht zuvor initialisiert werden muss. Nehmen wir an, wir haben Zugriff auf eine Tabelle T von n nicht initialisierten Speicherzellen (nummeriert von 1 bis n) und möchten m Zellen dieses Arrays zuweisen, z. B. möchten wir T [ki]: = vi für Paare zuweisen ( k1, v1), ..., (km, vm), wobei alle ki unterschiedlich sind. Die Technik der verzögerten Initialisierung ermöglicht es uns, dies in nur O (m) -Operationen zu tun, anstatt O (m + n) -Operationen auszugeben, um zuerst alle Array-Zellen zu initialisieren. Die Technik besteht einfach darin, eine Tabelle V zuzuweisen, in der die Paare (ki, vi) in einer beliebigen Reihenfolge gespeichert sind, und für jedes i in die Zelle T [ki] die Position in V zu schreiben, an der der Schlüssel ki gespeichert ist, wobei die übrigen Zellen von T nicht initialisiert werden. Dies kann verwendet werden, um Abfragen auf folgende Weise zu behandeln: Wenn wir die Zelle T [k] für einige k nachschlagen, können wir prüfen, ob k im Bereich {1, ..., m} liegt: Wenn dies nicht der Fall ist, dann ist T [k] nicht initialisiert. Andernfalls überprüfen wir V [T [k]] und stellen sicher, dass die erste Komponente dieses Paares gleich k ist. Ist dies nicht der Fall, ist T [k] nicht initialisiert (und ist zufällig in den Bereich {1, ..., m} gefallen). Ansonsten wissen wir, dass T [k] tatsächlich eine der initialisierten Zellen ist und der entsprechende Wert die zweite Komponente des Paares ist.