tutorialspoint patterns pattern patron mvc make example java design-patterns singleton

patterns - singleton java login



Patrón Singleton(solución de Bill Pugh) (5)

Estoy leyendo wiki sobre el patrón singleton y no estoy seguro si entiendo esto: https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom parte de esto correctamente.

Para simplificar: ¿Por qué la solución de Bill Pugh es mejor que el ejemplo anterior?

¿Es porque una clase estática no es cargada por la máquina virtual antes de que realmente se use o algo así, por lo que no creamos el objeto antes de recurrir al método getInstance ()? Además, ¿ese método es seguro solo en la medida de inicializar el objeto?


¿Es porque una clase estática no es cargada por la máquina virtual antes de que realmente se use o algo así, por lo que no creamos el objeto antes de recurrir al método getInstance ()?

Correcto.

Además, ¿ese método es seguro solo en la medida de inicializar el objeto?

Asegura que solo se crea una instancia y ningún cliente recibe nada más que una referencia a las instancias totalmente inicializadas.


¿Es porque una clase estática no es cargada por la máquina virtual antes de ser utilizada?

No solo una clase estática, cualquier clase. Las clases no se cargan hasta que se les haga referencia. Consulte JLS - 12.4.1 cuando ocurre la inicialización

o algo así, ¿entonces no creamos el objeto antes de recurrir al método getInstance ()?

Exactamente.

Además, ¿ese método es seguro solo en la medida de inicializar el objeto?

La distribución de una referencia es segura para subprocesos, por lo que este método siempre es seguro para subprocesos, no solo en el momento de la creación.


Creo que la versión del Sr. Pugh se tiene en gran consideración porque solo realiza la creación de instancias del singleton cuando se llama a getInstance (), es decir, no cuando se carga la clase (la clase que contiene el método getInstance). Si su construcción singleton hace algo costoso, esto puede ser una ventaja para usted. Si usted es como la mayoría del mundo cuyos singletons son solo para evitar los métodos estáticos (y no se ha movido a los frameworks de inyección de dependencia), entonces no me perdería el sueño.

Como dice el artículo, el método del Sr. Pugh es más lento que la variable de instancia estática, pero en realidad si la clase Singleton se carga, de todos modos estará llamando al método getInstance. Entonces, como ejercicio de informática es útil, pero en el mundo real sus beneficios son discutibles.

PD: No me importa mucho el ejemplo del señor Bloch aquí, ya que usar una enumeración sería decir My Singleton IS-A enum, lo cual no me suena bien (especialmente de alguien que, con razón, dice que nunca implemente una interfaz solo para obtener las constantes)


JLS garantiza que una clase solo se carga cuando se usa por primera vez (haciendo que la inicialización de singleton sea floja) y que la carga de la clase es segura para subprocesos (lo que hace que el método getInstance también sea seguro para subprocesos)


La parte clave de la explicación es la siguiente:

La clase anidada no se hace referencia antes (y, por lo tanto, no se cargó antes por el cargador de clases) que el momento en que se llama a getInstance (). Por lo tanto, esta solución es segura para subprocesos sin requerir construcciones de lenguaje especiales (es decir, volátil o sincronizada).

La solución de Bill Pogh proporciona pereza.