Der statische Initialisierungsblock ist ein Codeblock, der bei der ersten Lade des Klassen durch die JVM vor der ersten Verwendung eines statischen Mitglieds oder der Erstellung einer Instanz der Klasse ausgeführt wird.
Historie der Frage:
Java hat von Anfang an statische Felder bereitgestellt, um gemeinsame Werte für alle Instanzen zu speichern. Für nicht-standardmäßige Initialisierungen oder komplexe Berechnungen beim Start der Klasse wurden static-Blöcke eingeführt.
Problem:
Normale statische Felder können direkt bei der Deklaration initialisiert werden, aber wenn die Initialisierung langwierig ist, Aufrufe anderer Klassen/Dateien/Datenbanken erfordert oder von komplexer Logik abhängt, müssen static-Blöcke verwendet werden. Falsche Verwendung von static-Blöcken kann zu unerwartetem Verhalten beim Laden von Klassen, Schwierigkeiten beim Testen und sogar zu Deadlocks führen.
Lösung:
Static-Blöcke werden nur für die komplexe Initialisierung statischer Ressourcen verwendet, wenn sie nicht in einem einzelnen Ausdruck ausgedrückt werden können. Ein gutes Beispiel ist das Laden von JDBC-Treibern, das Auslesen von Konfigurationen:
public class Config { public static Properties properties; static { properties = new Properties(); try (InputStream in = new FileInputStream("config.properties")) { properties.load(in); } catch (IOException e) { throw new ExceptionInInitializerError(e); } } }
Schlüsselfunktionen:
Kann man return innerhalb eines statischen Blocks verwenden?
Nein, der return-Befehl ist in static-Blöcken nicht erlaubt. Man kann throw verwenden, um eine Ausnahme auszulösen.
Wann wird der statische Block ausgeführt — beim Laden der Klasse oder bei der Erstellung eines Objekts?
Der statische Block wird einmal beim Laden der Klasse ausgeführt, selbst wenn kein Objekt erstellt wird.
Kann es mehrere static-Blöcke in einer Klasse geben? In welcher Reihenfolge werden sie ausgeführt?
Ja, man kann mehrere statische Blöcke deklarieren. Sie werden in der Reihenfolge ihres Auftretens im Code der Klasse ausgeführt.
In der Klasse liest der static-Block eine große Datei und verbindet sich mit einem externen Dienst. In Tests oder einfachen Dienstprogrammen wird die Klasse von der JVM langsam geladen.
Vorteile:
Nachteile:
Der static-Block überprüft beim Start das Vorhandensein der Softwarelizenz und wirft beim Fehler eine ExceptionInInitializerError.
Vorteile:
Nachteile: