Estábamos discutiendo en mi trabajo sobre el uso de enumeraciones en Java.
Un compañero de trabajo argumentaba que cuando se usan enumeraciones en el lado del servidor, siempre que sea necesario, debemos usar cadenas para hacer referencia a él (por ejemplo, al enviar datos desde JS al servidor o al almacenar en la base de datos), argumentando que esto es mucho más claro para el desarrollador y también argumentando que fallaría rápidamente en caso de errores tipográficos.
Siempre usé números enteros para identificar enumeraciones en estos casos, porque serían identificadores inmutables y no tendrían problemas de mayúsculas y minúsculas (aunque un desarrollador cometiera el error de usar el valor 2 en lugar de 1, no fallaría rápidamente).
Siendo muy analítico sobre estos argumentos, diría que usar cadenas es mejor, pero me da una sensación extraña (como si no fuera un buen enfoque).
¿Hay alguna mejor práctica con respecto a esta discusión que pueda guiarme?
Editar: siempre que sea posible, utilizamos la enumeración en sí, por lo que todo nuestro código Java utiliza la enumeración. Por "referencia a una enumeración" quiero decir: hacer referencia al valor en la enumeración al intercambiar datos de JavaScript al servidor o almacenar datos en la base de datos
fuente
Respuestas:
Buena pregunta. El uso de enum en Java está destinado principalmente a manejar información que es de naturaleza categórica. El ejemplo clásico es usar enum para manejar los cuatro tipos de palos que podría tener una tarjeta. Proporciona todas las ventajas de rendimiento del uso de un número entero y también está claro en su programa.
Entonces, fuera de Java, ¿por qué no seguirías usando un número entero? Tal vez no tenga tipos de enumeración fuera de Java, aunque eso no significa que no pueda continuar usando enteros con fines de rendimiento, ¿verdad? Sí, eso es completamente cierto, aunque considere lo que sucede cuando agrega un nuevo valor de enumeración. Si no lo agrega al final, todos los demás valores de enumeración después del nuevo valor se incrementarán en uno. Bueno, solo especificaremos el número para que no pueda cambiar o siempre lo agregaremos al final. ¿Confía en que sus compañeros de trabajo siempre harán lo correcto? Meh ¿Probablemente? ¿Ojalá? Tal vez no estás 100% en eso. Tenlo en cuenta por un segundo.
Su jefe le dice que hay un desastre en el cliente que usa su software después de la última actualización. Ahora todas las entidades X actúan como si se les asignara un valor de enumeración Y, incluso si realmente se les asignó Z. Usted verifica el repositorio y sí, alguien agregó un nuevo valor de enumeración y no siguió sus pautas como se lo pidió. Ahora tiene la complicación adicional de que en la base de datos está escrito 4, cuando realmente debería ser 3, excluyendo los registros que se han insertado antes de la actualización que realmente son 4. ¿Qué valor de enumeración corresponde a 4 de todos modos? ¿No es Y? No te acuerdas. Debe verificar el programa para verificar. En pocas palabras, es un desastre.
Si, en cambio, su base de datos escribió "CORAZONES", "DIAMANTES", "ESPADAS", "CLUBES", ha perdido poco en términos de espacio y ha ganado mucho. Es cierto que estamos hablando de un impacto menor en el rendimiento, pero realmente no debería estar accediendo a la base de datos con tanta frecuencia para marcar la diferencia. En cuanto al espacio, déjelo a los administradores de sistemas (no. Su. Problema.).
Si ha hecho un programa simple al que es fácil hacer cambios, se ha hecho un favor a largo plazo, confíe en mí. Este aspecto no es diferente en mi humilde opinión.
fuente
HEARTS
aHeart
o algo en su ejemplo) y de repente todo se rompe de nuevo.Estoy de acuerdo con la respuesta de Neil, pero solo una adición:
En Java las enumeraciones son objetos, por lo que pueden tener campos y métodos. Por lo tanto, puede dar a cada enumeración un valor especificado manualmente y, al hacer referencia al trabajo externo, use ese valor en su lugar.
Sobrevivirá tanto agregando / eliminando / reordenando como cambiando el nombre de la instancia de enum. Pero tendrá que escribir la lógica de serialización / deserialización para los campos de enumeración en lugar de utilizar el autómata disponible en muchas herramientas. (Es fácil, pero es un trabajo adicional).
Y debe mantener esos valores únicos manualmente (pero eso es lo mismo en las enumeraciones de estilo C), y puede escribir una prueba para verificar eso.
fuente