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 mim, isso normalmente está alinhado com uma tabela de pesquisa em um banco de dados (apenas para tabelas raramente atualizadas).
No entanto, quando tento usar findByTypeId
em uma instrução switch (da entrada do usuário mais provável) ...
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 outros já declararam, isso resulta em um NPE @ switch(personType) {
. Uma solução alternativa (isto é, "solução") que comecei a implementar foi adicionar um UNKNOWN(-1)
tipo.
public enum PersonType {
UNKNOWN(-1),
COOL_GUY(1),
JERK(2);
...
public static PersonType findByTypeId(int id) {
...
return UNKNOWN;
}
}
Agora, você não precisa fazer a verificação nula onde é importante e pode optar por, ou não, manipular os UNKNOWN
tipos. (NOTA: -1
é um identificador improvável em um cenário de negócios, mas obviamente escolha algo que faça sentido para o seu caso de uso).