2011-11-24 11 views
11

Tengo la necesidad de poder almacenar y recuperar enumeraciones de una base de datos SQLite, que he resuelto con el uso combinado de una clase contenedora y enumeraciones, pero creo que está muy mal diseñado .Almacenamiento y recuperación de enumeraciones en SQLite con Java

Cada vez que quiero agregar un nuevo elemento a la lista de enumeraciones, tengo que agregarlo en tres lugares diferentes.

La enumeración debe contener:

  • un int (o cadena) para representarla
  • una cadena de texto que da más texto sobre la enumeración en sí
  • un método para restablecer de alguna manera su estado de la base de datos

Actualmente se implementa como esto:

public class items 
{ 
    public enum types { 
     FOO(0), 
     BAR(1), 
     BAZ(2); 

     private final int _value; 
     types(int value){_value = value;} 
     public int value(){return _value;} 
    } 

    public static types Get(int i) 
    { 
     switch(i) 
     { 
      case 0: 
       return types.FOO; 
      case 1: 
       return types.BAR; 
      case 2: 
       return types.BAZ; 
      default: 
       return null; 
     } 
    } 

    public static String Get(Typer type) 
    { 
     switch(type) 
     { 
      case FOO: 
       return "This is foo!"; 
      case BAR: 
       return "This is bar!"; 
      case BAZ: 
       return "This is baz!"; 
      default: 
       return "No good!"; 
     } 
    } 
} 

¿Hay una mejor manera de manejar esto?

Respuesta

21

valor Un enum tiene FOO.ordinal() función es una representación numérica de un valor. La función devuelve su número entre cero y n-1 donde n - cuántos valores enum tiene. Luego, puede usar types.values()[i] para recuperar un valor por el número. Pero debe tener en cuenta que no está permitido reordenar o agregar una nueva enumeración en el medio, porque los números serán cambiados.

Además, puede usar types.valueOf("FOO") y FOO.name() para obtener una representación de cadena del valor enum. Es más seguro de usar, porque no depende del orden de la declaración.

+1

pero si va a almacenar la enumeración en cadena, no debe cambiar el nombre del valor enum .. cada uno tiene su ventaja y desventaja – yeahman

+0

Supongo que usar ordinal es más arriesgado ya que uno puede agregar fácilmente un nuevo enum escriba en el medio. Pero cambiar de nombre tiene un poco menos de probabilidad. Bueno, eso es lo que siento, podría estar equivocado –

+1

@RahulVerma Simplemente cubra con pruebas si es importante, y sin riesgo. Pero el almacenamiento de un único valor 'int' suele ser mucho más eficiente que una cadena. – kan

6

Puede usar el nombre enumerado para almacenar y recuperar.

types.valueOf("FOO") debe entregar types.FOO y types.FOO.name() le da el nombre de la enumeración.

Si desea recuperarlo por una variable miembro, puede hacer algo como esto:

public static Types byValue(final int value) { 
    Types returnvalue = FOO; // default returnvalue 
    for (final Types type : Types.values()) { 
     if (type.value == value) { 
      returnvalue = type; 
      break; 
     } 
    } 
    return returnvalue; 
} 

Si se trata de rendimiento crítico, puede poner todos los tipos en un mapa estático con el 'valor' como la llave. Entonces no necesita el ciclo y solo dice valueMap.get(value). El mapa debe inicializarse en un bloque estático en la enumeración.

Para obtener el valor de texto adicional, puede darle a la enumeración una segunda variable miembro de tipo String con un getter. Entonces, los valores int y String asociados solo están en la inicialización.

Por ejemplo,

FOO(0,"Hello I'm Foo"), 
BAA(1,"Hello I'm Baa"), 
... 
Cuestiones relacionadas