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

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
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica

📚 Artikel Terkait di Wikipedia

Singleton (informatica)

approccio si può classificare come basato sul principio della lazy initialization (lett. "inizializzazione pigra") in quanto la creazione dell'istanza

Vettore di inizializzazione

In crittografia un vettore di inizializzazione (VI), dall'inglese initialization vector (IV), è un blocco di bit di lunghezza predefinita che viene utilizzato

C++98

pratica l'unica aggiunta visibile fu l'aggiunta del concetto di 'value initialization'. ^ (EN) Bjarne Stroustrup, Chapter 1, 1.4.3 The 1998 Standard, in The

CoffeeScript

è: $(document).ready(function() { // Initialization code goes here }) Oppure solo: $(function() { // Initialization code goes here }) In CoffeeScript, la

Icw

Intracoastal Waterway International Council of Women Italian Championship Wrestling – federazione italiana di wrestling Initialization Command Word – Informatica

Modalità di funzionamento dei cifrari a blocchi

viene effettuato tra un vettore di inizializzazione IV (dall'inglese initialization vector) e il primo blocco di testo in chiaro. In decifratura, l'IV subisce

Most vexing parse

i(static_cast<int>(adouble)); Lo standard C++11 ha introdotto la uniform initialization syntax (sintassi di inizializzazione uniforme), che uniforma la sintassi

Object-relational mapping

programma, ed è altrimenti evitato (tecnica nota con il nome di lazy initialization). Gestione della concorrenza nell'accesso ai dati durante conversazioni