Lazy initialization

Nella programmazione software, si dice lazy initialization (lett. "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

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 la si richiede 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 orientato agli oggetti.

Voci correlate

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica