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

[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 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

[modifica | modifica wikitesto]
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica