Idioma de Initialize-On-Demand vs simple inicializador estático en la implementación Singleton
Es realmente necesario el lenguaje Initialize-On-Demand cuando se implementa un singleton seguro para subprocesos mediante la inicialización estática, o sería suficiente una simple declaración estática de la instancia?
Declaración simple de instancia como campo estático:
class Singleton
{
private static Singleton instance=new Singleton();
private Singleton () {..}
public static Singleton getInstance()
{
return instance;
}
}
vs
class Singleton {
static class SingletonHolder {
static final Singleton INSTANCE = new Singleton();
}
private Singleton () {..}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
Pregunto esto porque Brian Goetz recomienda el primer enfoque en este artículo:
http: //www.ibm.com/developerworks/java/library/j-dcl/index.htm
mientras él sugiere lo último en este artículo
http: //www.ibm.com/developerworks/library/j-jtp03304
¿Ofrece este último enfoque algún beneficio que el primero no ofrece?