Maison >Java >javaDidacticiel >Élément Utiliser l'initialisation paresseuse avec parcimonie
Qu'est-ce que l'initialisation paresseuse ?
Meilleures pratiques et exemples
Exemple :
private final FieldType field = computeFieldValue();
Utilisez l'initialisation normale pour la plupart des champs, sauf indication contraire.
Exemple :
private FieldType field; synchronized FieldType getField() { if (field == null) { field = computeFieldValue(); } return field; }
3. Pratique de classe Carrier (pour les champs statiques)
Exemple :
private static class FieldHolder { static final FieldType field = computeFieldValue(); } static FieldType getField() { return FieldHolder.field; }
Avantage : initialise la classe uniquement lors de l'accès au champ, avec un coût minimal après initialisation.
4. Pratique de double vérification (pour les champs d'instance)
Exemple :
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. Pratique de vérification unique (initialisation répétée autorisée)
Exemple
private volatile FieldType field; FieldType getField() { if (field == null) { // Verificação única field = computeFieldValue(); } return field; }
6. Pratique audacieuse du chèque unique
Exemple :
private FieldType field; FieldType getField() { if (field == null) { // Sem volatile field = computeFieldValue(); } return field; }
Considérations générales
Compromis :
Synchronisation multithread :
Utilisation préférée :
Résumé final
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!