Enum en Java. Ventajas?

¿Cuáles son algunas ventajas de hacer enum en Java similar a una clase, en lugar de solo una colección de constantes como en C / C ++?

Obtiene tiempo de comstackción libre de valores válidos. Utilizando

public static int OPTION_ONE = 0; public static int OPTION_TWO = 1; 

no garantiza

 void selectOption(int option) { ... } 

solo aceptará 0 o 1 como valor de parámetro. Usando una enumeración, eso está garantizado. Además, esto conduce a un mayor código de autoedición, porque puede usar la finalización del código para ver todos los valores enum.

Tipo de seguridad es una razón.

Otro, que me parece más importante , es que puede adjuntar metadatos a valores enum en Java. Por ejemplo, puede usar una enumeración para definir el conjunto de operaciones legales para un servicio web, y luego adjuntar metadatos para el tipo de solicitud y clase de datos:

 AddItem(HttpMethod.POST, ProductEntry.class), 

Las encuadernaciones de Java 5 se originaron a partir de un modelo de enum de tipo seguro de Effective Java de Joshua Bloch (la primera edición) para evitar las trampas de enumeraciones en C / C ++ / C # (que son simplemente constantes int escasamente veladas) y el uso en Java de final constantes int estáticas.

Principalmente, las constantes int y las enumeraciones int no son seguras. Puede pasar cualquier valor int. En C / C ++ puedes hacer esto:

 enum A { one, two, three }; enum B { beef, chicken, pork } b = beef; void func(A a) { ... } func((A)b); 

Desafortunadamente, el patrón de enum de tipo seguro de Effective Java tenía un montón de texto repetitivo, no todo era obvio. Lo más notable es que tuvo que anular el método privado readResolve para detener la creación de nuevas instancias en la deserialización de Java, lo que rompería la verificación de referencia simple (es decir, utilizando el operador == lugar de equals() ).

Así que Java 5 enumeraciones ofrecen estas ventajas sobre ints:

  • Tipo de seguridad;
  • Las enumeraciones de Java 5 pueden tener comportamiento e implementar interfaces;
  • Las enumeraciones Java 5 tienen algunas estructuras de datos extremadamente ligeras como EnumSet y EnumMap .

Java 5 enumera estas ventajas sobre simplemente usar clases:

  • readResolve() menos propensa a errores (constructor privado, readResolve() etc.);
  • Corrección semántica Ves que algo es una enumeración y sabes que solo representa un valor. Ves una clase y no estás seguro. Tal vez hay un método de fábrica estático en alguna parte, etc. Java 5 enumeraciones indican mucho más claramente la intención.

Los enums ya son una clase en Java .

Si estás preguntando por qué esto es mejor, diría que me vendría a la mente una mejor seguridad de tipo y la posibilidad de agregar otros atributos además de un mero valor ordinal.

Además de un mejor tipo de seguridad, también puede definir el comportamiento personalizado en sus enumeraciones (consulte Effective Java para algunos buenos ejemplos).

Puede usar enumeraciones para implementar de manera efectiva Singletons ^^:

 public enum Elvis { INSTANCE } 

Al hacer que enum sea un tipo de referencia que puede contener un conjunto fijo de constantes, se ha logrado una implementación eficiente de Map como EnumMap y Set Implementation como EnumSet (clases JDK).

De javadoc de EnumMap:
Una implementación de mapa especializada para utilizar con claves de tipo enum. Todas las claves en un mapa enum deben provenir de un único tipo de enumeración que se especifica, explícita o implícitamente, cuando se crea el mapa. Los mapas de Enum están representados internamente como matrices. Esta representación es extremadamente compacta y eficiente.

EnumMap combina la riqueza y la seguridad del tipo de Map con la velocidad de una matriz ( Effective Java ).

Los enumeraciones son un tipo en sí mismo: no se puede usar una enumeración que no existe, o poner en alguna otra constante de aspecto similar. y también, puedes enumerarlos, para que el código pueda ser más conciso.

el uso de constantes estáticas podría causar pesadillas de mantenimiento, especialmente si se extienden por el área.

La única ventaja real es que se puede usar en una statement de switch . Todas las demás cosas de las que puede hacer una enumeración se pueden hacer simplemente con una clase simple de vainilla con un constructor private cuyas instancias a su vez se declaran como campos public static final de la clase en cuestión (el patrón de tipo seguro). La otra ventaja de enum es, obviamente, que hace que el código sea menos detallado de lo que harías con una clase normal simple.

Pero si no me equivoco, en C ++ (¿o era C #?) Puede usar un String en una instrucción switch . Entonces, esa ventaja de las enumeraciones en Java es insignificante en comparación con C ++. Sin embargo, lo mismo se propuso para Java 7, no estoy seguro si lo hará.

Beneficios del uso de enumeraciones: se puede crear un objeto para que funcione de la misma manera que una enumeración. De hecho, las enumeraciones ni siquiera se incluyeron en el lenguaje Java hasta la versión 5.0. Sin embargo, las enumeraciones hacen que el código sea más legible y proporcionan menos espacio para el error del progtwigdor.

Progtwig de estudios OCA Java SE 7 Progtwigdor I Guía de estudio