Enum Singletons son nuevas formas de usar Enum con una sola instancia para implementar el patrón Singleton en Java. Si bien ha habido un patrón Singleton en Java durante mucho tiempo, Enum Singletons es un término comparativamente reciente y en uso desde la implementación de Enum como palabra clave y función desde Java 5 en adelante.
Ventajas de usar Enum como Singleton:
1. Los Enum Singletons son fáciles de escribir: si ha estado escribiendo Singletons antes de Java 5, este es, con mucho, el mayor beneficio que se da cuenta de que puede tener más de una instancia, incluso con el bloqueo verificado dos veces. Si bien este problema se resuelve mejorando el modelo de memoria de Java y garantizando variables volátiles desde Java 5 en adelante, todavía es difícil de escribir para muchos principiantes.
En comparación con el bloqueo de verificación doble con sincronización, los singletons de Enum son muy fáciles. Si no cree que se compare el siguiente código para singleton tradicional con bloqueo verificado dos veces y Enum Singletons:
Singleton usando Enum en Java: por defecto, la creación de la instancia de Enum es segura para subprocesos, pero cualquier otro método de Enum es responsabilidad del programador.
public enum EasySingleton{ INSTANCE; }
Puede acceder a él mediante EasySingleton.INSTANCE, mucho más simple que llamar a la función getInstance() en Singleton.
2. Enum Singletons manejó la serialización por sí mismos
Otro problema con los Singleton convencionales es que ya no son Singleton una vez que implementas una interfaz serializable porque el método readObject() siempre devuelve una nueva instancia como el constructor de Java. Al usar el método readResolve() y descartar las instancias recién creadas, puede evitar eso al sustituir Singleton, como se muestra en el siguiente ejemplo:
private Object readResolve(){ return INSTANCE; }
Si su clase Singleton mantiene el estado, esto puede volverse aún más complejo, ya que necesita hacerlos transitorios, pero JVM garantiza la serialización con Enum Singleton.
3. La creación de instancias de Enum es segura para subprocesos
De manera predeterminada, la instancia de Enum es segura para subprocesos y no necesita preocuparse por el bloqueo verificado dos veces.
En resumen, el patrón Singleton es la mejor manera de crear Singleton en el mundo de Java 5, dada la serialización y la seguridad de subprocesos garantizada y con alguna enumeración de línea de código.
Java
// Java program to demonstrate the example // of using Enum as Singleton enum SingletonEnum { INSTANCE; int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; } } class Main { public static void main(String[] args) { SingletonEnum singleton = SingletonEnum.INSTANCE; System.out.println(singleton.getValue()); singleton.setValue(2); System.out.println(singleton.getValue()); } }
0 2
Desventajas de usar Enum como singleton:
1. Restricciones de codificación
En las clases regulares, hay cosas que se pueden lograr pero que están prohibidas en las clases enum. Accediendo a un campo estático en el constructor, por ejemplo. Dado que está trabajando en un nivel especial, el programador debe ser más cuidadoso.
2. Serializabilidad
Para singletons, es muy común tener estado. En general, esos singletons no deberían ser serializables. No hay ningún ejemplo real en el que tenga sentido transportar un singleton con estado de una VM a otra VM; un singleton significa «único dentro de una VM» no «único en el universo»
Si la serialización realmente tiene sentido para un singleton con estado, el singleton debe especificar de forma explícita y precisa lo que significa en otra máquina virtual deserializar un singleton donde ya puede haber un singleton del mismo tipo.
Guardamos algunas líneas de código en enum, pero el precio es demasiado alto, tenemos que llevar todo el equipaje y las limitaciones de enum, sin darnos cuenta heredamos «características» de enum que tienen consecuencias no deseadas. Una desventaja resulta ser el único supuesto beneficio: serialización automática.
Publicación traducida automáticamente
Artículo escrito por KapilChhipa y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA