Heim >Java >javaLernprogramm >Artikel Verwenden Sie die verzögerte Initialisierung sparsam
Was ist verzögerte Initialisierung?
Best Practices und Beispiele
Beispiel:
private final FieldType field = computeFieldValue();
Verwenden Sie für die meisten Felder die normale Initialisierung, sofern nicht anders erforderlich.
Beispiel:
private FieldType field; synchronized FieldType getField() { if (field == null) { field = computeFieldValue(); } return field; }
3. Carrier-Klassenpraxis (für statische Felder)
Beispiel:
private static class FieldHolder { static final FieldType field = computeFieldValue(); } static FieldType getField() { return FieldHolder.field; }
Vorteil: Initialisiert die Klasse nur, wenn auf das Feld zugegriffen wird, mit minimalen Kosten nach der Initialisierung.
4. Übung zur doppelten Überprüfung (für Beispielfelder)
Beispiel:
private volatile FieldType field; FieldType getField() { FieldType result = field; if (result == null) { // Primeira verificação (sem bloqueio) synchronized (this) { result = field; if (result == null) { // Segunda verificação (com bloqueio) field = result = computeFieldValue(); } } } return result; }
5. Einzelprüfungspraxis (wiederholte Initialisierung zulässig)
Beispiel
private volatile FieldType field; FieldType getField() { if (field == null) { // Verificação única field = computeFieldValue(); } return field; }
6. Mutige Single-Check-Praxis
Beispiel:
private FieldType field; FieldType getField() { if (field == null) { // Sem volatile field = computeFieldValue(); } return field; }
Allgemeine Überlegungen
Kompromisse:
Multithread-Synchronisierung:
Bevorzugte Verwendung:
Abschließende Zusammenfassung
Das obige ist der detaillierte Inhalt vonArtikel Verwenden Sie die verzögerte Initialisierung sparsam. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!