[JAVA] Point 83: Utilisez judicieusement l'initialisation paresseuse

83. L'initialisation différée doit être utilisée avec prudence

// Normal initialization of an instance field
private final FieldType field = computeFieldValue();
// Lazy initialization of instance field - synchronized accessor
private FieldType field;
 private synchronized FieldType getField() {
    if (field == null)
        field = computeFieldValue();
    return field;
}
// Lazy initialization holder class idiom for static fields
private static class FieldHolder {
  static final FieldType field = computeFieldValue();
}
private static FieldType getField() { return FieldHolder.field; }
// Double-check idiom for lazy initialization of instance fields
private volatile FieldType field;
 private FieldType getField() {
    FieldType result = field;
    if (result == null) {  // First check (no locking)
        synchronized(this) {
            if (field == null)  // Second check (with locking)
                field = result = computeFieldValue();
        }
    }
    return result;
}
// Single-check idiom - can cause repeated initialization!
private volatile FieldType field;
 private FieldType getField() {
    FieldType result = field;
    if (result == null)
        field = result = computeFieldValue();
    return result;
}

Recommended Posts

Point 83: Utilisez judicieusement l'initialisation paresseuse
Item 52: Utiliser la surcharge judicieusement
Point 53: Utilisez judicieusement les varargs
Point 45: Utilisez judicieusement les flux
Point 66: Utiliser judicieusement les méthodes natives
Point 67: Optimiser judicieusement
Article 55: Renvoyez judicieusement les options
Point 26: N'utilisez pas de types bruts
Point 32: Combiner judicieusement les génériques et les varargs
Point 59: Connaître et utiliser les bibliothèques
Élément 40: utiliser systématiquement l'annotation de remplacement