Ho la seguente Enum:enumerazioni condiviso metodo statico look-up
public enum MyEnum{
A(10, "First"), //
B(20, "Second"), //
C(35, "Other options");
private Integer code;
private String description;
private MyEnum(Integer code, String description) {
this.code = code;
this.description = description;
}
public Integer getCode() {
return code;
}
public String getDescription() {
return description;
}
public static MyEnum getValueOf(Integer code) {
for (MyEnum e : MyEnum.values()) {
if (e.getCode().equals(code)) {
return e;
}
}
throw new IllegalArgumentException("No enum const " + MyEnum.class.getName() + " for code \'" + code
+ "\'");
}
}
che funziona bene. Il metodo getValueOf
esiste perché, quando comunichiamo con un partner esterno, otteniamo solo il codice (che hanno scelto) per mappare. Ho bisogno della descrizione perché ho bisogno di mostrare una frase significativa nella GUI.
Ma ora ho un numero di classi enum simili. Tutti con la propria descrizione del codice & e hanno bisogno della stessa funzionalità di ricerca. Volevo che il metodo getValueOf
fosse generico, quindi non ho bisogno di supportare più di 30 enumerazioni per lo stesso metodo.
Per risolvere questo obiettivo, ho voluto creare una classe astratta per definire questo metodo e implementare alcune delle logiche comuni, ma ciò è impossibile perché non posso estendere Enum
.
Poi ho provato a fare una classe di utilità con il seguente metodo:
public static <T extends Enum<T>> T getValueOf(Enum<T> type, Integer code) {...}
Ma i farmaci generici con enumerazioni sono confusa e non capisco come ottenere questo lavoro.
Fondamentalmente quello che voglio sapere è: qual è un buon approccio per definire un'utilità comune a un enum?
FYI, il precedente potrebbe generare un NPE se getCode restituisce null. Vorrei mettere un check in 'if' condizionale per null. –
@JohnB, davvero. Ho copiato il codice dall'OP e non mi sono preoccupato di migliorarlo. Se mai, invece di un controllo nullo, cambierei il tipo di 'codice' in' int' per stroncare il problema sul nascere. –
In realtà l'ho preso e incorporato nel mio progetto di utilità. Fatto 'Encodable' generico quindi il metodo è diventato' statico pubblico & Encodable > T getValueOf (Classe enumClass, codice U) 'Spero non ti dispiaccia. –