Ir al contenido principal

Convertir int a enum en Java

Hoy me he estado peleando en java buscando la forma de convertir un entero que hay almacenado en la BD a un tipo enumerado que tengo definido en mi aplicación. En los métodos de serie no viene nada así que venga buscar, y mas buscar, y he dado con dos soluciones:

Primera solución:
En el caso de que la enumeración que tenemos almacenada empiece en 0, podremos usar esto:
MyEnum foo = MyEnum.values()[valorEnteroDeLaBD];
Las pegas de este sistema es que el coste de llamar a .values() es muy alto además de que estamos obligados a empezar la enumeración en 0.

Segunda solución y la mejor para mi:
Dentro del enum declaramos un Map statico y un metodo estatico que rellene el Map. Además deberemos crear un atributo valor para poder almacenar el valor enumerado que queramos. Esto quedaria asi:
import java.util.HashMap;
import java.util.Map;

public enum EstadoIncidencia {
 ABIERTO_POR_CLIENTE(1), RESPONDIDO(2), EN_PROCESO(3), CERRADO(4);

 private int value;
 private static final Map typesByValue = new HashMap();

 static {
  for (EstadoIncidencia type : EstadoIncidencia.values()) {
   typesByValue.put(type.value, type);
  }
 }

 private EstadoIncidencia(int value) {
  this.value = value;
 }

 public int getValue() {
  return value;
 }
 
 public static EstadoIncidencia forValue(int value) {
  return typesByValue.get(value);
 }
}
Esto lo he encontrado en StackOverflow: http://stackoverflow.com/questions/5292790/convert-integer-value-to-matching-java-enum
Espero os sea igual de util que a mi ;).

Comentarios

Entradas populares de este blog

Formatear fecha JSON

Para poder representar de forma bonita y humana una fecha retornada por un JSON por ejemplo, la función quedaría tal que así. En mi caso, el formato esperado es: dd/MM/yyyy hh:mm

function FormatDate(fecha) { var fechaObj = new Date(fecha); return (fechaObj.getDate() < 10 ? '0' : '') + fechaObj.getDate() + '/' + (fechaObj.getMonth() < 10 ? '0' : '') + fechaObj.getMonth() + '/' + fechaObj.getYear() + ' ' + (fechaObj.getHours() < 10 ? '0' : '') + fechaObj.getHours() + ':' + (fechaObj.getMinutes() < 10 ? '0' : '') + fechaObj.getMinutes(); };

Generar números aleatorios con Postgres

Muchas veces nos encontraremos con que tenemos que poblar una BD con numeros para poder testear un funcionalidad que estemos programando. En postgres es tan sencillo como:

update schema.tabla set columnaNumerica = floor(random() * N) + desviacion;
Con desviación me refiero a que, si no lo añadimos, random generara numeros empezando por el 0 hasta N. El uso de floor es para redondear y quedarme solo con la parte entera. Ya que random genera floats entre 0 y 1.

Espero os sirva este pequeño truquillo. Un saludico.