====== Unsafe lazy instantiation ====== In questo Antipattern sono presenti vari problemi, il più ovvio è quello alla creazione di ''finti'' Singleton. L'accesso non esclusivo alla ''getInstance()'' può favorire la creazione di più istanze differenti della risorsa. Altri e più subdoli problemi sono discussi nel [[DoubleCheckedLockingIdiom]] public class UnsafeLazyInstantiation { private static Resource _instance; public static Resource getInstance() { if (_instance == null) _instance = new Resource(); // unsafe publication :-P return _instance; } ....... } La soluzione immediata al problema dei finiti Singleton è la seguente public class SimpleLazyInstantiation { private static Resource _instance; public synchronized static Resource getInstance() { if (_instance == null) _instance = new Resource(); // sate publication :-| return _instance; } ....... } si nota in fatti che il metodo ''getInstance()'' è sincronizzato, non è quindi possibile che due o più Thread vi accedano in contemporanea. Nonostante il precedente codice sia sicuro può non essere sempre un'ottima cosa sincronizzare il metodo di istanziazione. Java permette il caricamento ''lazy'' di una classe tramite il LazyClassLoading utilizzabile tramite gli inizializzatori statici. La versione pulita per l'instanziazione lazy è la seguente public class EagerInstantiation { private static final Resource _instance = new Resource(); public static Resource getResource() { return _instance; // :-) } }