Я знаю, что этому вопросу уже несколько лет, но поскольку Java 8 тем временем принесла нам Optional
, я решил предложить решение с его использованием (и Stream
и Collectors
):
public enum PcapLinkType {
DLT_NULL(0),
DLT_EN3MB(2),
DLT_AX25(3),
/*snip, 200 more enums, not always consecutive.*/
// DLT_UNKNOWN(-1); // <--- NO LONGER NEEDED
private final int value;
private PcapLinkType(int value) { this.value = value; }
private static final Map<Integer, PcapLinkType> map;
static {
map = Arrays.stream(values())
.collect(Collectors.toMap(e -> e.value, e -> e));
}
public static Optional<PcapLinkType> fromInt(int value) {
return Optional.ofNullable(map.get(value));
}
}
Optional
похоже на null
: представляет собой случай, когда нет (действительного) значения. Но это более безопасная альтернатива null
или значение по умолчанию, такое как DLT_UNKNOWN
, потому что вы можете забыть проверить случаи null
или DLT_UNKNOWN
. Они оба являются действительными PcapLinkType
значениями! Напротив, вы не можете присвоить значение Optional<PcapLinkType>
переменной типа PcapLinkType
. Optional
заставляет вас сначала проверять правильное значение.
Конечно, если вы хотите сохранить DLT_UNKNOWN
для обратной совместимости или по любой другой причине, вы все равно можете использовать Optional
даже в этом случае, используя orElse()
, чтобы указать его в качестве значения по умолчанию:
public enum PcapLinkType {
DLT_NULL(0),
DLT_EN3MB(2),
DLT_AX25(3),
/*snip, 200 more enums, not always consecutive.*/
DLT_UNKNOWN(-1);
private final int value;
private PcapLinkType(int value) { this.value = value; }
private static final Map<Integer, PcapLinkType> map;
static {
map = Arrays.stream(values())
.collect(Collectors.toMap(e -> e.value, e -> e));
}
public static PcapLinkType fromInt(int value) {
return Optional.ofNullable(map.get(value)).orElse(DLT_UNKNOWN);
}
}