Wann sollten Klassen initialisiert werden - zur Ladezeit oder beim ersten Gebrauch?

8

Man kann eine Klasse dynamisch mit dieser Methode von java.lang.Class laden:

%Vor%

Nach der JavaDoc , der zweite Parameter wird verwendet, um das Timing der Klasseninitialisierung (Ausführung des statischen Initialisierungscodes) zu steuern. Wenn true , wird die Klasse nach dem Laden und während der Ausführung dieser Methode initialisiert; Wenn false , wird die Initialisierung verzögert, bis die Klasse das erste Mal verwendet wird.

Nun, ich verstehe das alles, aber die Dokumente sagen nicht, wie sie entscheiden sollen, welche Strategie sie verwenden sollen. Ist es besser, die Initialisierung immer sofort durchzuführen? Ist es besser, den ersten Gebrauch immer zu verzögern? Kommt es auf die Umstände an?

    
Simon Kissane 11.09.2014, 07:15
quelle

1 Antwort

5

Ja, das hängt von den Umständen ab, aber normalerweise ist es vorzuziehen, dass Klassen erst beim ersten Gebrauch geladen und initialisiert werden.

Fälle, in denen Sie diese möglicherweise frühzeitig initialisieren möchten (z. B. durch Aufrufen von forName() für sie):

  • Statische Initialisierungsblöcke können Prüfungen für externe Ressourcen (z. B. Dateien, Datenbankverbindung) durchführen, und wenn diese fehlschlagen, wollen Sie nicht einmal die Ausführung Ihres Programms fortsetzen.
  • Ähnlich wie zuvor: Laden von externen, nativen Bibliotheken. Wenn diese fehlschlagen (oder nicht für die aktuelle Plattform geeignet sind), sollten Sie dies frühzeitig erkennen und nicht mit Ihrer App fortfahren.
  • Statische Initialisierungsblöcke können langwierige Operationen ausführen und Sie möchten später keine Verzögerungen haben, wenn sie wirklich benötigt werden. Sie können sie zu einem früheren Zeitpunkt oder mit verschiedenen Hintergrundthreads initialisieren.
  • Wenn Sie statische Konfigurationsdateien haben, in denen Klassennamen als Text angegeben sind, möchten Sie sie möglicherweise frühzeitig initialisieren / laden, um Konfigurationsfehler / Schreibfehler zu erkennen. Solche Beispiele sind Logger-Konfigurationsdateien, web.xml, Spring Context usw.
  • Viele Klassen in der Standard-Java-Bibliothek cachen bestimmte Daten wie die HTTPUrlConnection zwischengespeichert den HTTP-Benutzer-Agent, der von System.getProperty("http.agent") zurückgegeben wird. Wenn es zum ersten Mal verwendet wird, wird sein Wert zwischengespeichert und wenn Sie es ändern (mit like System.setProperty() ), wird der neue Wert nicht verwendet. Sie können ein solches Caching erzwingen, wenn Sie die richtigen Klassen frühzeitig initialisieren und sie so schützen, dass sie später vom Code geändert werden können.

Fälle, in denen Sie nicht frühzeitig initialisieren sollten:

  • Klassen, die möglicherweise nur in seltenen Fällen benötigt werden, oder sie werden möglicherweise während der Laufzeit Ihrer Anwendung gar nicht benötigt. Beispielsweise zeigt eine GUI-Anwendung möglicherweise nur das Dialogfeld "Info" an, wenn der Benutzer das Menü "Hilfe / Info" auswählt. Offensichtlich keine Notwendigkeit, die relevanten Klassen früh zu laden (z. B. AboutDialog ), weil dies ein seltener Fall ist und in den meisten Läufen wird der Benutzer dies nicht tun / brauchen.
icza 11.09.2014, 07:20
quelle

Tags und Links