with varargs run read pass from example java arguments

varargs - Enumeración de Java vs. constantes estáticas



run java main with arguments (9)

Estoy viendo algunos códigos Java que son mantenidos por otras partes de la compañía, incidentalmente, algunos antiguos desarrolladores de C y C ++. Una cosa que es ubicua es el uso de constantes enteras estáticas, tales como

class Engine { private static int ENGINE_IDLE = 0; private static int ENGINE_COLLECTING = 1; ... }

Además de un calificador ''final'' faltante, me molesta un poco este tipo de código. Lo que me hubiera gustado ver, ser entrenado principalmente en Java desde la escuela, sería algo más como

class Engine { private enum State { Idle, Collecting }; ... }

Sin embargo, los argumentos me fallan. ¿Por qué, si es que lo es, es mejor este último que el primero?


¿Por qué, si es que lo es, es mejor este último que el primero?

Es mucho mejor porque le brinda seguridad de tipo y se autodocumenta. Con las constantes de enteros, debe mirar la documentación de la API para averiguar qué valores son válidos, y nada le impide usar valores no válidos (o, quizás peor, constantes de enteros que no están relacionadas). Con Enums, la firma del método le dice directamente qué valores son válidos (el autocompletado de IDE funcionará) y es imposible usar un valor no válido.

Desafortunadamente, el patrón de "enteros constantes enums" es muy común, incluso en la API estándar de Java (y se copia ampliamente desde allí) porque Java no tenía Enums antes de Java 5.


  1. Readabiliy : cuando usa enumeraciones y hace State.Idle , el lector inmediatamente sabe que está hablando de un estado inactivo. Compara esto con 4 o 5.

  2. Tipo de seguridad : cuando se usa enumeración, incluso por error, el usuario no puede pasar un valor incorrecto, ya que el compilador lo obligará a usar uno de los valores declarados previamente en la enumeración. En el caso de los enteros simples, incluso podría pasar -3274.

  3. Mantenimiento : si desea agregar un estado nuevo en Waiting , sería muy fácil agregar un estado nuevo agregando un estado de espera constante en su estado de enumeración sin causar confusión.

Al usar un int para referirse a una constante, no está obligando a alguien a usar esa constante. Entonces, por ejemplo, podría tener un método que tome un estado de motor, al que alguien podría invocar de manera feliz con:

engine.updateState(1);

El uso de una enum obliga al usuario a atenerse a la etiqueta explicativa, por lo que es más legible.


El primero es común en el código que comenzó pre-1.5. En realidad, otro idioma común era definir sus constantes en una interfaz, porque no tenían ningún código.


Enums también le dan una gran flexibilidad. Dado que los Enums son esencialmente clases, puede aumentarlos con métodos útiles (como proporcionar una cadena de recursos internacionalizada correspondiente a un cierto valor en la enumeración, convertir entre las instancias del tipo de enumeración y otras representaciones que puedan ser necesarias, etc. )


Hay una situación en la que se prefiere la constancia estática (en lugar de que el código sea heredado con una tonelada de dependencia) y es cuando el miembro de ese valor no es / puede que luego no sea finito.

Imagínese si luego puede agregar un nuevo estado como Collected . La única forma de hacerlo con enumeración es editar el código original, lo que puede ser un problema si la modificación se realiza cuando ya hay muchos códigos que lo manipulan. Aparte de esto, personalmente no veo ninguna razón por la que no se use enumeración.

Sólo mi pensamiento.


Las razones de la especificación, que Lajcik cita, se explican con más detalle en el artículo 30 de Java efectiva de Josh Bloch. Si tiene acceso a ese libro, le recomiendo que lo lea detenidamente. Las Enums de Java son clases completas y es por eso que obtienes seguridad de tipo de tiempo de compilación. También puedes darles comportamiento, dándote mejor encapsulación.



Un extracto de los documentos oficiales, http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html :

Este patrón tiene muchos problemas, tales como:

  • No tipifico: ya que una temporada es solo un int, puede pasar en cualquier otro valor int donde se requiera una temporada, o agregar dos temporadas juntas (lo que no tiene sentido).
  • Sin espacio de nombres: debe prefijar las constantes de un enum int con una cadena (en este caso SEASON_) para evitar colisiones con otros tipos de enum int.
  • Fragilidad: debido a que los ent enums son constantes en tiempo de compilación, se compilan en los clientes que los usan. Si se agrega una nueva constante entre dos constantes existentes o se cambia el orden, los clientes deben volver a compilarse. Si no lo son, seguirán corriendo, pero su comportamiento será indefinido.
  • Los valores impresos no son informativos: debido a que son solo caracteres, si imprime uno, lo único que obtiene es un número, que no le dice nada sobre lo que representa, ni siquiera qué tipo es.

Y esto casi lo cubre. Un argumento de una palabra sería que las enumeraciones son más legibles e informativas.

Una cosa más es que las enumeraciones, como las clases. Puede tener campos y métodos. Esto le brinda la opción de incluir información adicional sobre cada tipo de estado en la enumeración en sí.