Cuando trabajo con variables / parámetros que solo pueden tomar un número finito de valores, trato de usar siempre Java enum
, como en
public enum BonusType {
MONTHLY, YEARLY, ONE_OFF
}
Mientras permanezca dentro de mi código, eso funciona bien. Sin embargo, a menudo necesito interactuar con otro código que usa valores simples int
(o String
) para el mismo propósito, o necesito leer / escribir desde / hacia una base de datos donde los datos se almacenan como un número o cadena.
En ese caso, me gustaría tener una forma conveniente de asociar cada valor de enumeración con un número entero, de modo que pueda convertir en ambos sentidos (en otras palabras, necesito una "enumeración reversible").
Pasar de enum a int es fácil:
public enum BonusType {
public final int id;
BonusType(int id) {
this.id = id;
}
MONTHLY(1), YEARLY(2), ONE_OFF(3);
}
Entonces puedo acceder al valor int como BonusType x = MONTHLY; int id = x.id;
.
Sin embargo, no veo una buena manera de lo contrario, es decir, pasar de int a enum. Idealmente, algo como
BonusType bt = BonusType.getById(2);
Las únicas soluciones que se me ocurren son:
- Ponga un método de búsqueda en la enumeración, que se usa
BonusType.values()
para llenar un mapa "int -> enum", luego lo almacena en caché y lo usa para búsquedas. Funcionaría, pero tendría que copiar este método de forma idéntica en cada enumeración que uso :-(. - Coloque el método de búsqueda en una clase de utilidad estática. Entonces solo necesitaría un método de "búsqueda", pero tendría que jugar con la reflexión para que funcione para una enumeración arbitraria.
Ambos métodos parecen terriblemente incómodos para un problema tan simple (?).
¿Alguna otra idea / conocimiento?
ordinal()
.ordinal()
), o son decididos por fuerzas externas?