Donné:
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;
}
}
Pour moi, cela correspond généralement à une table de recherche dans une base de données (pour les tables rarement mises à jour uniquement).
Cependant, lorsque j'essaie d'utiliser findByTypeId
dans une instruction switch (à partir, probablement, d'une entrée utilisateur) ...
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.
}
... comme d'autres l'ont dit, cela se traduit par un NPE @ switch(personType) {
. Une solution de contournement (c'est-à-dire «solution») que j'ai commencé à implémenter consistait à ajouter un UNKNOWN(-1)
type.
public enum PersonType {
UNKNOWN(-1),
COOL_GUY(1),
JERK(2);
...
public static PersonType findByTypeId(int id) {
...
return UNKNOWN;
}
}
Désormais, vous n'avez plus à vérifier la valeur nulle là où cela compte et vous pouvez choisir de gérer ou non les UNKNOWN
types. (REMARQUE: -1
est un identifiant improbable dans un scénario commercial, mais choisissez évidemment quelque chose qui a du sens pour votre cas d'utilisation).