Dado:
public enum PersonType {
COOL_GUY(1),
JERK(2);
private final int typeId;
private PersonType(int typeId) {
this.typeId = typeId;
}
public final int getTypeId() {
return typeId;
}
public static PersonType findByTypeId(int typeId) {
for (PersonType type : values()) {
if (type.typeId == typeId) {
return type;
}
}
return null;
}
}
Para mí, esto generalmente se alinea con una tabla de búsqueda en una base de datos (solo para tablas que rara vez se actualizan).
Sin embargo, cuando trato de usar findByTypeId
en una declaración de cambio (de, muy probablemente, la entrada del usuario) ...
int userInput = 3;
PersonType personType = PersonType.findByTypeId(userInput);
switch(personType) {
case COOL_GUY:
// Do things only a cool guy would do.
break;
case JERK:
// Push back. Don't enable him.
break;
default:
// I don't know or care what to do with this mess.
}
... como han dicho otros, esto da como resultado un NPE @ switch(personType) {
. Una solución alternativa (es decir, "solución") que comencé a implementar fue agregar un UNKNOWN(-1)
tipo.
public enum PersonType {
UNKNOWN(-1),
COOL_GUY(1),
JERK(2);
...
public static PersonType findByTypeId(int id) {
...
return UNKNOWN;
}
}
Ahora, no tiene que hacer una verificación nula donde cuenta y puede elegir manejar o no los UNKNOWN
tipos. (NOTA: -1
es un identificador poco probable en un escenario empresarial, pero obviamente elige algo que tenga sentido para su caso de uso).