Lazy initialization
Nella programmazione software, si dice Lazy initialization (inizializzazione pigra) la tattica di istanziare un oggetto, inizializzare una variabile, effettuare un calcolo o eseguire un processo solo nel momento in cui tale operazione è richiesta.
Tipicamente, questo si ottiene memorizzando in un flag l'avvenimento di un determinato processo. Ogni volta che avviene un certo evento, si esamina il flag. Se questo è abbassato, si continua, altrimenti si inizializza una certa variabile o si istanzia un certo oggetto.
La "lazy factory"
modificaDal punto di vista dei design pattern, la lazy initialization si usa spesso con un factory method. Questo combina tre idee:
- usare un factory method per instanziare una classe;
- memorizzare l'istanza di una mappa, in modo tale da poter riprendere la stessa istanza la volta successiva che si richiede la stessa con certi parametri (confronta con un singleton);
- usare la lazy initialization per istanziare un oggetto la prima volta che è richiesto.
Un piccolo esempio (in Java): la classe Frutta
viene impiegata a soli fini esemplificativi per mostrare questo pattern di inizializzazione.
import java.util.*;
public class Frutta {
/**
* Mappatura tra tipo di frutta (String) e la sua istanza (Frutta)
*/
private static Map<String, Frutta> tipologie = new HashMap<String, Frutta>();
/**
* Contiene il tipo di Frutta dell'istanza corrente
*/
private String tipo;
/**
* Costruttore privato per forzare l'uso del metodo factory.
* @param tipo Stringa che descrive il tipo di frutta da istanziare
*/
private Frutta(String tipo){
this.tipo=tipo;
tipologie.put(tipo, this);
}
/**
* Metodo Lazy con pattern Factory: recupera un'istanza di Frutta associata ad un certo tipo,
* se presente, altrimenti istanzia un nuovo oggetto.
* @param tipo Una stringa che descrive un tipo di frutta, ad esempio "mela"
* @return Una istanza di Frutta associata al tipo
*/
public static Frutta getFrutta(String tipo) {
Frutta f;
if (tipologie.containsKey(tipo)){
f = tipologie.get(tipo); // recupera l'istanza di quel tipo
} else {
f = new Frutta(tipo); // inizializzazione lazy (pigra)
}
return f;
}
}
La tecnica può essere usata anche in un linguaggio non-object-oriented.
Voci correlate
modifica- Design pattern
- anti-pattern
- Design Patterns - libro
- Singleton (informatica) - per un elegante esempio di impiego della lazy initialization