Lazy initialization

Da Wikipedia, l'enciclopedia libera.

Nella programmazione software, si dice Lazy initialization (inizializzazione pigra) la tattica di istanziare un oggetto, inizializzare una variabile, effettuare un calcolo od 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"[modifica | modifica wikitesto]

Dal 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 | modifica wikitesto]