Lazy initialization design pattern

La Lazy initialization, ovvero inizializzazione pigra, è una tattica che prevede l’istanziazione un oggetto, inizializzazione di una variabile, lo svolgimento di un calcolo piuttosto che l’esecuzione di un processo esclusivamente nel momento in cui tale operazione è richiesta.

Lo scopo di questo pattern, è legato al miglioramento delle performance di un applicativo.

Come si può dedurre quindi, la Lazy initialization si rende applicabile nei seguenti casi:

  • ritardare un’operazione costosa fino a quando è assolutamente necessario svolgerla
  • memorizzare il risultato di operazioni complesse in modo da non doverle svolgerle nuovamente

Le immediate conseguenze dell’applicazione di questo pattern, sono quindi espresse dalla logica alla base del pattern stesso. Ottimizzare le operazioni costose, rendendole “pigre” e tenendo memorizzati i risultati dell’elaborazione ove fossero presenti.

Come ovvio il miglioramento delle performance che si ottiene applicando questo pattern (ove ce ne fosse), è strettamente legato alle caratteristiche del problema e a volte può non essere significativo. Come per ogni ottimizzazione, questa tecnica dovrebbe essere utilizzata solo se c’è un beneficio evidente.

Di solito, il pattern viene implementato memorizzando in un flag l’avvenimento di un determinato processo. Ogni volta che avviene un certo evento, si esamina il flag. Se il flag è settato a false, si continua, altrimenti si inizializza una certa variabile o si istanzia un certo oggetto.


/* Fonte: Wikipedia */
/* Lazy Initialization */

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;
}
}

Tags: , ,

Lascia un Commento

Connect with Facebook