¿Cómo hacer Singleton en Java? Tipos de inicialización, comparación y puntos para recordar

Publicado: 2020-10-07

Una clase singleton en Java se define como aquella clase que tiene solo un objeto, es decir, solo una instancia de la clase. La restricción de la instancia a solo una por clase ayuda a codificar programas particulares que requieren solo una instancia de la clase. La única instancia de una clase singleton recibe un punto de acceso global.

La clase Singleton es uno de los patrones de diseño importantes en la programación Java. Las clases Singleton ayudan a limitar los recursos y optimizarlos; se usa mucho en conexiones de bases de datos o sockets. Hay sintaxis de implementación para la clase singleton, y un buen desarrollador debe conocerlas. Veamos la implementación de la clase singleton en Java.

Aprenda programas de ingeniería de software en línea de las mejores universidades del mundo. Obtenga programas Executive PG, programas de certificados avanzados o programas de maestría para acelerar su carrera.

Leer: Explicación de la arquitectura y los componentes de Java

Tabla de contenido

Inicialización

La inicialización de un singleton en Java se realiza a través de un constructor privado. Los constructores privados ayudan en otras clases que no pueden crear la misma instancia que su clase singleton. Hay cinco tipos de inicialización de la clase singleton en Java que se enumeran a continuación:

1. Inicialización ansiosa

Se crea un método público comúnmente llamado getInstance(). Este método ayudará a proporcionar solo un punto de entrada para crear una instancia de la clase, convirtiéndola así en una clase única. La instancia de la clase en la inicialización ansiosa se crea en el momento de la carga de la clase.

Este tipo de técnica de inicialización crea la instancia de la clase automáticamente, incluso si el usuario no la está utilizando. Esto puede causar problemas de memoria y una longitud innecesaria en el código. Para contrarrestar el problema de la fuga de memoria, veamos otro tipo de técnica de inicialización para una clase singleton en Java.

2. Inicialización perezosa

La instancia de la clase se inicializa en el método getInstance () en la inicialización diferida. El método en la inicialización perezosa verificará si la instancia de la clase se crea o no y, si no se crea, solo crea una instancia, resolviendo así el problema de pérdida de memoria.

El método que se crea en la inicialización diferida es estático y tiene un objeto de tipo de retorno. La instancia singleton en la inicialización diferida no se creará hasta que se llame al método getInstance() por primera vez.

3. Inicialización diferida con método de doble bloqueo

Este método se utiliza en el momento de más de un hilo. Si estamos usando dos subprocesos en el programa, y ​​se puede acceder a ambos a través de la declaración 'if' al comenzar cuando la instancia es nula, se creará una situación de conflicto y es posible que encuentre errores.

Este problema se resuelve mediante el método de doble bloqueo en el que solo un subproceso ingresa a la vez en el bloque sincronizado para la inicialización de la instancia mientras que el otro subproceso está bloqueado. Cuando el primer subproceso sale del bloque sincronizado, solo el segundo subproceso ingresa y crea otra instancia. De forma predeterminada, el segundo subproceso no comprueba si la instancia no es nula o no.

4. Método de carga diferida

La clase interna anidada se crea con este método y funciona según los principios de JLS (especificaciones del lenguaje Java). No habría miembros de datos estáticos en la clase; JVM no creará una instancia de la clase. La instancia solo se crearía bajo demanda cuando invoquemos el método getInstance().

No es necesario que sincronice el método de inicialización y carga, ya que este método ayuda en la sincronización automática de todas las invocaciones de obtención de Instancia().

5. Método de enumeraciones

Aún se pueden crear múltiples instancias de una clase singleton mediante serialización y reflexión en los métodos anteriores. En el caso de hacer una clase singleton estricta, se puede usar este método. Los campos de enumeraciones se utilizan en este método, que es una constante y se ejecuta solo en tiempo de compilación.

Un Enum es la instancia del tipo Enum y se construirá solo cuando el tipo Enum se invoque/llame por primera vez en el código. Este método restringe la clonación de instancias y crea una clase singleton perfecta.

Lea también: Los 12 mejores programas de patrones en Java que debe consultar hoy

Serialización y reflexión

La serialización ayuda en el transporte de objetos Java de una JVM (Java Virtual Machine) a otra. La serialización es uno de los métodos utilizados para crear múltiples instancias de una clase. La serialización convierte el objeto en un flujo de bytes y luego se realiza la transferencia.

El flujo de bytes ayuda a recrear el objeto en alguna otra JVM mediante el proceso de deserialización. Ayuda a múltiples sistemas a comunicarse y compartir objetos entre ellos. Ayuda en la sincronización cruzada de JVM ya que los objetos funcionarán en diferentes JVM.

Reflection es también un método de clonación de objetos en Java. Reflection es una API que nos ayuda a conocer la clase de cualquier objeto y métodos desconocidos de esa clase en particular a los que se puede acceder a través del objeto. Los programadores utilizan ampliamente la reflexión para modificar el comportamiento de las clases y los métodos en tiempo de ejecución.

Los tres comandos principales utilizados en la reflexión son getClass() para conocer la clase a la que pertenece el objeto, getConstructors() para obtener los constructores públicos de la clase del objeto, getMethods() para conocer los métodos públicos de la clase bajo observación.

Clase Normal Vs Clase Singleton

Una clase estándar en Java usa constructores para inicializarse, mientras que nosotros usamos el método getInstance() para inicializar una clase singleton. También podemos usar el mismo nombre de clase y método. Primero creamos un objeto para las clases normales y luego usamos sus métodos y propiedades.

Por el contrario, en una clase singleton, creamos una instancia utilizando la propiedad estática de la clase y, en cualquier punto del código, esa clase en particular devolverá solo una instancia.

Además de muchas ventajas de las clases singleton, también existen algunas lagunas, como los métodos de prueba de unidad de manipulación de clases singleton si los objetos y métodos están estrechamente acoplados. Tendrá que dedicar una clase completamente funcional a un singleton en ese caso.

A veces, la clase singleton también crea dependencias ocultas, ya que la referencia de la clase singleton se pasa a otros métodos y no es completamente transparente, lo que dificulta que los codificadores/desarrolladores realicen un seguimiento de los métodos y las clases. Se deben tener en cuenta estas deficiencias antes de crear un patrón singleton y se debe tratar de minimizarlo.

Puntos para hacer una clase Singleton perfecta

1. Los puntos en los que se debe enfocar para hacer una clase singleton perfecta son los siguientes:

2. Si está creando varios subprocesos en una clase singleton, asegúrese de que todos los subprocesos no deben inicializar la clase singleton al mismo tiempo. Uno debería intentar crear clases singleton seguras para subprocesos.

3. Haga que su clase de singleton sea a prueba de reflexión, cambiando la visibilidad del constructor al público en el tiempo de ejecución y asegurándose de que solo haya una instancia de cualquier clase de singleton en particular.

4. Si hay varios subprocesos, puede usar un modificador volátil que evita que un subproceso mire el estado inicializado de otros subprocesos. Un modificador volátil funciona en la relación "sucede antes" en la que la escritura ocurre en un subproceso antes de que cualquier otro subproceso pueda leerlo.

Debe leer: Interesantes ideas de proyectos Java para principiantes

Conclusión

Las clases Singleton se utilizan para realizar conexiones personalizadas a la base de datos o cualquier programa en el que desee controlar los métodos y las instancias de la clase.

Si desea mejorar sus habilidades de Java, debe tener en sus manos estos proyectos de Java. Si está interesado en obtener más información sobre Java, desarrollo de pila completa, consulte el programa Executive PG de upGrad & IIIT-B en desarrollo de software: especialización en desarrollo de pila completa, que está diseñado para profesionales que trabajan y ofrece más de 500 horas de formación rigurosa, 9 + proyectos y asignaciones, estado de ex alumnos de IIIT-B, proyectos finales prácticos y asistencia laboral con las mejores empresas.

Conviértase en un desarrollador de pila completa

Solicitar Maestría en Ciencias en Ciencias de la Computación