Дано:
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;
}
}
Для меня это обычно совпадает с таблицей поиска в базе данных (только для редко обновляемых таблиц).
Однако, когда я пытаюсь использовать findByTypeId
в операторе switch (скорее всего, из пользовательского ввода) ...
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.
}
... как уже говорили другие, это приводит к NPE @ switch(personType) {
. Одним из обходных путей (т. Е. «Решением»), который я начал реализовывать, было добавление UNKNOWN(-1)
типа.
public enum PersonType {
UNKNOWN(-1),
COOL_GUY(1),
JERK(2);
...
public static PersonType findByTypeId(int id) {
...
return UNKNOWN;
}
}
Теперь вам не нужно выполнять нулевую проверку, когда она имеет значение, и вы можете выбирать, обрабатывать или не обрабатывать UNKNOWN
типы. (ПРИМЕЧАНИЕ: -1
маловероятный идентификатор в бизнес-сценарии, но, очевидно, выберите то, что имеет смысл для вашего варианта использования).