Clase Singleton en Java: ¿Cómo usar la clase Singleton?



Este artículo sobre la clase Singleton en Java habla sobre las diversas formas en que se puede hacer una clase Singleton junto con implementaciones prácticas.

En Java, una clase singleton es una clase que solo puede tener una instancia en un momento dado. Es uno de los cinco patrones de diseño creacional en Java que ayuda en el desarrollo sin esfuerzo de . A través de este artículo, le daré información clara sobre qué es una clase singleton en Java y cómo puede crearla.

A continuación se muestran los temas que cubriré en este artículo:





Empecemos.

¿Qué es una clase Singleton en Java?

En términos simples, una clase Singleton en Java es la clase que permite el acceso a ella a través de una sola instancia a la vez. Este patrón de diseño sirve para restringir la creación innecesaria de instancias de una clase y garantizar que solo una existe en cualquier momento por instancia de JVM. Por lo tanto, con este patrón, cualquier clase que se defina como Singleton tiene solo una instanciacon un punto de acceso global al mismo. A diferencia de las clases normales, una clase singleton no se destruye al final del ciclo de vida de las aplicaciones.



java de copia superficial vs profunda

Pero, ¿por qué necesitamos una clase Singleton en primer lugar?

Bueno, al restringir la creación de instancias de una clase, se ahorra espacio en la memoria, ya que ahora el objeto no se creará cada vez que se realice una nueva solicitud. En su lugar, se utilizará un solo objeto repetidamente. Esta es la razón por la que el patrón Singleton en Java se usa principalmente con y aplicaciones de bases de datos. Se utiliza básicamente para registro, almacenamiento en caché, agrupación de subprocesos, ajustes de configuración y muchos más..

Espero que tengas claro el concepto de clase Singleton en Java. Entonces, ahora continuemos en esteClase Singleton en el artículo de Java y vea cómo se crean.



Formas de diseñar una clase Singleton de Java

Para hacer una clase singleton en Java, necesita las siguientes tres cosas:

  1. miembro estático de una clase
  2. constructor privado
  3. método de fábrica estático

Dado que Java permite a los desarrolladores explorar sus horizontes, hayvarias formas en las que puede diseñar una clase Singleton. A continuación, he enumerado los más populares.

tutorial de microsoft sql server para principiantes
  1. Método de inicialización ansioso
  2. Método de inicialización diferida
  3. Método de hilo único seguro
  4. Inicialización diferida con método de bloqueo doble
  5. Método de carga diferida
  6. Método de inicialización de bloque estático

Profundicemos ahora en cada uno de estos enfoques uno por uno.

1. Método de inicialización ansioso

Este es el método más fácil de crear una clase Singleton donde la instancia se crea en el momento de la carga de la clase. Para crear una clase singleton con este método, debe seguir los pasos que se mencionan a continuación:

  1. Declare el constructor privado.
  2. El siguiente paso es crear un miembro de clase privada para esta clase Singleton.
  3. Ahora, debe definir un método de fábrica que se utilizará para devolver el objeto de su clase, que hemos creado como una instancia del miembro de la clase.
  4. Incluso puede declarar público un miembro estático si desea acceder a esta instancia estática directamente.

Ahora, veamos cómo implementarlos.

// Eager Initialization public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}

Si ve el código, puede observar que cada vez que estamos instanciando un objeto estamos haciendo uso de laobtener Instancia()método en lugar de invocar la clase constructor .Pero tiene sus propias desventajas. Si usa este método para hacer un singleton de clase, entonces se creará una instancia independientemente del hecho de que la aplicación lo esté usando o no.

Entonces, sigamos adelante y veamos otra forma de crear una clase singleton en Java.

2. Método de inicialización diferida

Este método se llama inicialización diferida porque pospone la creación de la instancia de clase hasta su primer uso. Lo que quiero decir es que, con este método, se crea un objeto solo si es necesario. Ayuda a evitar la creación innecesaria de . Para diseñar una clase singleton de esta manera, debe seguir los pasos que se enumeran a continuación:

  1. En primer lugar, declare el constructor como privado.
  2. Luego, debe crear una instancia estática privada para esta clase, pero aún no es necesario crear una instancia.
  3. Finalmente, cree un método de fábrica que primero verifique si el miembro de la instancia es nulo o no. De lo contrario, creará una instancia de la clase singleton para usted y la devolverá.

El siguiente código muestra cómo realizar esto.

// Inicialización perezosa public class LazySingleton {private static LazySingleton INSTANCE = null private LazySingleton () {} public static LazySingleton getInstance () {if (INSTANCE == null) {synchronized (LazySingleton.class) {INSTANCE = new LazySingleton ()}} return INSTANCE}}

3. Singleton seguro para subprocesos Método

Pero el enfoque anterior puede generar algunas preocupaciones en los escenarios simultáneos. Dado que el patrón singleton se utiliza principalmente con subprocesos múltiples y sivarios subprocesos ingresan la condición if al mismo tiempo, pueden generar problemas. Para evitar esto, intentamos crear una clase singleton segura para subprocesos sincronizando el método de acceso global. Esto asegura que solo un subproceso esté ejecutando este método en cualquier momento. Consulte el siguiente código para ver la implementación:

// Thread Safe Singleton public class ThreadSafeSingleton {privado estático ThreadSafeSingleton INSTANCE privado ThreadSafeSingleton () {} público estático sincronizado ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSingleton ()} return INSTANCE}}

Pero a veces este enfoque también puede volverse muy engorroso ya que cada vez que el métodose invoca, debe esperar a que se libere el bloqueo antes de que el método pueda usarlo. Esto da como resultado una ralentización del proceso y nos lleva al siguiente enfoque que esInicialización diferida con Double Lock.

4. Inicialización diferida con bloqueo doble Método

En este enfoque, no sincronizamos los métodos. Más bien, envolvemos el código de creación del objeto dentro de un bloque sincronizado.Puede decir que al verificar los bloqueos del hilo de antemano,reduce el número de adquisiciones de cerraduras. Este enfoque suele dar como resultado un aumento del rendimiento de la aplicación. Consulte el siguiente código para ver cómo se hace.

// Inicialización perezosa con Double Lock public class LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (INSTANCIA == null) {sincronizado (LazyDoubleLockSingleton.class == {if (INSTANCIA) null) {INSTANCE = new LazyDoubleLockSingleton ()}}} return INSTANCE}}

5. Método de carga diferida

Este método se basa en JSL (Java Language Specification) y de acuerdo con este cargará miembros de datos estáticos solo cuando sean necesarios. Por lo tanto, cuando su clase singleton se carga en la JVM, no se crea ninguna instancia. Además, durante la ejecución del programa, el método global se invoca en orden secuencial. Con este método, no es necesario sincronizar explícitamente el getInstance () estático para cargar e inicializar. El miembro de la clase estática se invocará de forma secuenciada adecuada, el resto de las invocaciones simultáneas del método global se devolverán en el mismo orden sin tener que realizar la sobrecarga de sincronización.

A continuación se muestra el código para realizar lo mismo.

// Método de carga diferida public class LazyLoadSingleton {private LazyLoadSingleton () {} private static class SingletonClassHolder {static final Var INSTANCE = new LazyLoadSingleton ()} public static LazyLoadSingleton getInstance () {return SingletonClassHolder.INSTANCE}}

6. Método de inicialización de bloque estático

Este método de crear una clase singleton en Java essimilar al método de inicialización ansioso. La única diferencia es que la instancia para esta clase se crea dentro del bloque estático que tiene funcionalidad.

// Static Block Initialization public class StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // manejo de excepciones dentro del bloque estático static {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {throw new RuntimeException ('Exception ocurrió al crear una clase Singleton ')}} public static StaticBlockSingleton getInstance () {return INSTANCE}}

Esto nos lleva al final de este artículo sobre la clase Singleton en Java. Si quieres saber más sobre Java puedes consultar nuestro .

Ahora que ha entendido qué es una clase Singleton en Java, consulte la por Edureka, una empresa de aprendizaje en línea de confianza con una red de más de 250.000 alumnos satisfechos repartidos por todo el mundo. El curso de certificación y capacitación Java J2EE y SOA de Edureka está diseñado para estudiantes y profesionales que desean ser desarrolladores de Java. El curso está diseñado para darle una ventaja en la programación de Java y capacitarlo para los conceptos básicos y avanzados de Java junto con varios marcos de Java como Hibernate y Spring.

cómo copiar un objeto en java

Tienes una pregunta para nosotros? Por favor, menciónelo en la sección de comentarios de este artículo 'Clase Singleton en Java' y nos comunicaremos con usted lo antes posible.