Gibt es irgendwelche Garantien in JLS über die Reihenfolge der Ausführung statische Initialisierung blockiert?

StackOverflow https://stackoverflow.com/questions/3028219

  •  26-09-2019
  •  | 
  •  

Frage

Ich frage mich, ob es zuverlässig ist, eine Konstruktion zu verwenden, wie:

private static final Map<String, String> engMessages;
private static final Map<String, String> rusMessages;

static {
    engMessages = new HashMap<String, String> () {{
        put ("msgname", "value");
    }};
    rusMessages = new HashMap<String, String> () {{
        put ("msgname", "значение");
    }};
}

private static Map<String, String> msgSource;

static {
    msgSource = engMessages;
}

public static String msg (String msgName) {
    return msgSource.get (msgName);
}

Gibt es eine Möglichkeit, dass ich NullPointerException bekommen würde, weil msgSource Initialisierungsbaustein wird vor dem Block ausgeführt werden, die engMessages initialisiert?

(warum ich nicht msgSource Initialisierung am Ende des oberen init tue Block. Nur die Frage des Geschmacks, ich würde so tun, wenn der beschriebene Aufbau unzuverlässig ist)

War es hilfreich?

Lösung

Ja, statische Initialisierer Blöcke sind garantiert in Text Auftrag auszuführen.

Von dem JLS, Abschnitt 12.4.1 :

  

Die Absicht ist, dass eine Klasse oder Interface-Typ eine Reihe von Initialisierungen hat, dass es in einem konsistenten Zustand versetzt, und dass dieser Zustand ist der erste Staat, der von anderen Klassen beobachtet wird. Die statischen Initialisierungen und Klasse Variableninitialisierungen werden in Text Reihenfolge ausgeführt , und beziehen sich nicht auf Klassenvariablen in der Klasse deklariert, deren Erklärungen erscheinen textlich nach dem Gebrauch, obwohl diese Klassenvariablen in ihrem Umfang sind (§8.3 .3). Diese Einschränkung wird zur Erkennung, bei der Kompilierung, die meisten Kreis- oder ungültiges Initialisierungen.

Und von 12.4 0,2 :

  

Als nächstes ausführen entweder die Klassen Variableninitialisierungen und statische Initialisierungen der Klasse, oder das Feld initializers die Schnittstelle in Text Ordnung , als wären sie ein einziger Block.

Persönlich obwohl, würde ich alle Variablendeklarationen am Anfang setzen und dann einem einzigen statischen Initialisierungsblocks. Ich denke, dass viel einfacher zu folgen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top