El artículo 3 de de Josh Block Effective Java (Aplicar la propiedad Singleton con un constructor privado o un enumerador) menciona que "aunque este enfoque aún no se ha adoptado ampliamente, un tipo de enumeración de elemento único es la mejor manera de implementar un semifallo."¿Es el Single-Element Enum Type Singleton realmente una buena idea ampliamente adoptada?
Ejemplo:
public enum Elvis {
INSTANCE;
private final String[] favoriteSongs =
{ "Hound Dog", "Heartbreak Hotel" };
public void printFavorites() {
System.out.println(Arrays.toString(favoriteSongs));
}
}
continuó: "Este enfoque es funcionalmente equivalente a la aproximación del campo público, excepto que es más conciso, proporciona el mecanismo de serialización de forma gratuita, y proporciona una garantía rigurosa contra la creación de instancias múltiples, incluso frente a sofisticados ataques de serialización o reflexión ".
El mayor aspecto negativo que veo es: ¿no se supone que las enumeraciones tienen estado mutable? Parece común usar un Singleton con estado.
Entonces, ¿este patrón en realidad se ha vuelto más común desde la fecha de publicación (segunda edición publicada en 2008)?
¿Soy la única persona que se siente incómoda por cómo las enumeraciones en Java pueden comportarse como clases? Parece que Java decidió eliminar los "tipos de aspecto natural" que podría hacer en C++ al sobrecargar los métodos, y convirtió las enumeraciones directas en esta extraña burbuja. – Uri
C++ se acerca a las enumeraciones como una extensión del uso de ints para el cambio, por lo que son construcciones muy simples. En Java, por otro lado, las enumeraciones se conciben como clases legítimas, con toda la funcionalidad que trae consigo, que difieren solo en su restricción (principal) en la creación de instancias. Tienen el mismo nombre porque sus usos se superponen en algunas áreas importantes, pero tengan cuidado de compararlos demasiado de cerca: son bestias muy diferentes. – tlayton
@Uri, 'enum's en Java no se comportan simplemente como clases, son _ clases_. Todos extienden implícitamente 'java.lang.Enum'. – Pops