tengo la siguiente enumeración:enumeraciones compartían método estático de consulta
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
+ "\'");
}
}
que funciona muy bien. El método getValueOf
existe porque cuando nos comunicamos con un socio externo, solo obtenemos el código (que eligieron) para mapear. Necesito la descripción porque necesito mostrar una frase significativa en la GUI.
Pero ahora tengo un número de clases enum similares. Todos tienen su propia descripción de código &, y necesitan la misma funcionalidad de búsqueda. Quería que el método getValueOf
fuera genérico, así que no necesito admitir más de 30 enumeraciones diferentes para básicamente el mismo método.
Para resolver esto, quería hacer una clase abstracta para definir este método e implementar algunas de las lógicas comunes, pero esto es imposible porque no puedo extender Enum
.
Luego trató de hacer una clase de servicio con el siguiente método:
public static <T extends Enum<T>> T getValueOf(Enum<T> type, Integer code) {...}
Pero los genéricos con enumeraciones son confusas y no entiendo cómo conseguir este trabajo.
Básicamente lo que quiero saber es: ¿Cuál es un buen enfoque para definir una utilidad común para una enumeración?
FYI, el anterior podría arrojar un NPE si getCode devuelve nulo. Yo pondría un cheque en el condicional 'if' para null. –
@JohnB, de hecho. Copié el código del OP y no me molesté en mejorarlo. En todo caso, en lugar de una verificación nula, cambiaría el tipo de 'código' por' int' para cortar el problema de raíz. –
De hecho, tomé esto y lo incorporé en mi propio proyecto de utilidad. Hecho genérico 'Encodable' por lo que el método se convirtió' public static & Encodable > T getValueOf (Clase enumClass, código U) 'Espero que no te importe. –