Un piccolo grande Singleton

By jesty

Il singleton, forse il più semplice dei pattern, ma non è detto che implementarlo sia così semplice e che soprattutto ciò venga ben fatto.  Per i meno esperti ricordiamo che il Singleton è un pattern creazionale di fondamentale importanza ed è stato introdotto dalla GoF. Questo serve a garantire che di un determinato oggetto esisti solo una istanza e che questa abbia un punto di accesso unico.

Recentemente su onjava.com è uscito questo articolo che consiglia la seguente implementazione:

public class Singleton {
private Singleton(){}
static class SingletonHolder {
static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}

contro la classica implementazione:
public class Singleton {
private Singleton(){}
static Singleton instance;
public static synchronized Singleton getInstance() {
if (instance == null) instance = new Singleton();
return instance;
}
}

Viene consigliata questa implementazione perchè a differenza delle altre implementa bene il meccanismo di Lazy Loading (cioè caricare in memoria solo quello che serve e quando serve). Questo avviene perchè l’oggetto non viene istanziato fino a quando non viene chiamato il suo costruttore e venendo questo chiamato all’interno di una inner class static questo avverrà solamente quando verrà chiamato per la prima volta il metodo getInstance() della classe Singleton. Altro motivo è avere una implementazione comunque thread-safe ma che non usi metodi definiti come syncronized perchè molto onerosi dal punto di vista prestazionale e perchè la necessità di avere il metodo syncronized definito come tale è veramente poco frequente.

Lascia un commento