He intentado resumir mi comprensión. No dude en editar esto si tiene alguna corrección. Así que aquí va:
En el código
En el código, enumeraciones deben ser manejados usando cualquiera de los tipos enum nativo del idioma (por lo menos en Java y C#), o el uso de algo así como el "typesafe enum pattern". No se recomienda el uso de constantes simples (entero o similar), ya que se pierde la seguridad del tipo (y dificulta la comprensión de qué valores son datos legales, por ejemplo, un método).
La elección entre estos dos depende de la cantidad de funcionalidad adicional se va a unir a la enumeración:
- Si usted quiere poner un montón de funcionalidad en la enumeración (lo cual es bueno, porque se evita el interruptor () ing todo el tiempo), una clase suele ser más apropiada.
- Por otro lado, para valores sencillos como enum, la enumeración del lenguaje suele ser más clara.
En particular, por lo menos en una enumeración de Java no puede heredar de otra clase, por lo que si usted tiene varias enumeraciones con un comportamiento similar que le gustaría poner en una superclase, no se puede utilizar enumeraciones de Java.
enumeraciones La persistencia de
a persistir enumeraciones, cada valor de enumeración se deben asignar un identificador único. Esto puede ser un número entero o una cadena corta. Se prefiere una cadena corta, ya que puede ser mnemónica (hace que sea más fácil para los DBA, etc., comprender los datos sin procesar en el db).
- En el software, cada enum debe entonces tener funciones de mapeo para convertir entre el enum (para uso en el interior del software) y el valor de ID (por persistir). Algunos marcos (por ejemplo, (N) Hibernate) tienen un soporte limitado para hacer esto automáticamente. De lo contrario, debes ponerlo en el tipo/clase enum.
- La base de datos debe contener (idealmente) una tabla para cada enumeración que enumere los valores legales. Una columna sería la ID (ver arriba), que es la PK. Las columnas adicionales pueden tener sentido para, por ejemplo, una descripcion. Todas las columnas de la tabla que contendrán valores de esa enumeración pueden entonces usar esta "tabla de enumeración" como FK. Esto garantiza que los valores de enum incorrectos nunca pueden persistir, y permite que el DB "se soporte por sí mismo".
Un problema con este enfoque es que la lista de valores de enum legales existe en dos lugares (código y base de datos). Esto es difícil de evitar y, por lo tanto, a menudo se considera aceptable, pero hay dos alternativas:
- Solo conserve la lista de valores en el DB, genere el tipo de enumeración en tiempo de compilación. Elegante, pero significa que se requiere una conexión de base de datos para que se ejecute una construcción, lo que parece problemático.
- Defina la lista de valores en el código para ser autoritativo. Verifique los valores en el DB en tiempo de ejecución (generalmente al inicio), se queje/aborte cuando no coinciden.
De acuerdo en principio, sin embargo, al menos en Java "enum" es limitado en que no puede tener una superclase (como se señaló anteriormente), por lo que a veces una clase "enum de tipo seguro" es probablemente mejor. – sleske