Quando lavoro con variabili / parametri che possono accettare solo un numero finito di valori, cerco di usare sempre Java enum
, come in
public enum BonusType {
MONTHLY, YEARLY, ONE_OFF
}
Finché rimango nel mio codice, funziona bene. Tuttavia, spesso ho bisogno di interfacciarmi con altro codice che utilizza plainint
String
valori (o ) per lo stesso scopo, oppure ho bisogno di leggere / scrivere da / a un database in cui i dati sono memorizzati come un numero o una stringa.
In tal caso, mi piacerebbe avere un modo conveniente per associare ogni valore enum a un intero, in modo tale da poter convertire in entrambi i modi (in altre parole, ho bisogno di un "enum reversibile").
Passare da enum a int è facile:
public enum BonusType {
public final int id;
BonusType(int id) {
this.id = id;
}
MONTHLY(1), YEARLY(2), ONE_OFF(3);
}
Quindi posso accedere al valore int come BonusType x = MONTHLY; int id = x.id;
.
Tuttavia, non vedo un bel modo per il contrario, ovvero passare da int a enum. Idealmente, qualcosa di simile
BonusType bt = BonusType.getById(2);
Le uniche soluzioni che potrei trovare sono:
- Metti un metodo di ricerca nell'enum, che usa
BonusType.values()
per riempire una mappa "int -> enum", quindi lo memorizza nella cache e lo usa per le ricerche. Funzionerebbe, ma dovrei copiare questo metodo in modo identico in ogni enum che uso :-(. - Metti il metodo di ricerca in una classe di utilità statica. Quindi avrei bisogno solo di un metodo di "ricerca", ma dovrei giocherellare con la riflessione per farlo funzionare per un'enumerazione arbitraria.
Entrambi i metodi sembrano terribilmente scomodi per un problema così semplice (?).
Altre idee / intuizioni?
ordinal()
.ordinal()
) o sono decisi da forze esterne?