Ao trabalhar com variáveis / parâmetros que podem assumir apenas um número finito de valores, tento sempre usar Java enum
, como em
public enum BonusType {
MONTHLY, YEARLY, ONE_OFF
}
Contanto que eu permaneça dentro do meu código, funciona bem. No entanto, geralmente preciso fazer a interface com outro código que usa valores simples int
(ou String
) para o mesmo propósito, ou preciso ler / gravar de / para um banco de dados onde os dados são armazenados como um número ou string.
Nesse caso, gostaria de ter uma maneira conveniente de associar cada valor de enum a um inteiro, de modo que eu possa converter as duas formas (em outras palavras, preciso de um "enum reversível").
Ir de enum para int é fácil:
public enum BonusType {
public final int id;
BonusType(int id) {
this.id = id;
}
MONTHLY(1), YEARLY(2), ONE_OFF(3);
}
Então, posso acessar o valor int como BonusType x = MONTHLY; int id = x.id;
.
No entanto, não consigo ver nenhuma maneira agradável de fazer o contrário, ou seja, indo de int para enum. Idealmente, algo como
BonusType bt = BonusType.getById(2);
As únicas soluções que consegui encontrar são:
- Coloque um método de pesquisa no enum, que usa
BonusType.values()
para preencher um mapa "int -> enum", então armazena isso em cache e o usa para pesquisas. Funcionaria, mas eu teria que copiar esse método de forma idêntica em cada enum que eu usar :-(. - Coloque o método de pesquisa em uma classe de utilitário estático. Então, eu precisaria apenas de um método de "pesquisa", mas teria que mexer com a reflexão para fazê-lo funcionar para um enum arbitrário.
Ambos os métodos parecem terrivelmente estranhos para um problema tão simples (?).
Alguma outra ideia / percepção?
ordinal()
.ordinal()
são decididos por você (ou seja, você não poderia simplesmente usar ) ou são decididos por forças externas?