Sei que essa pergunta já existe há alguns anos, mas como o Java 8, entretanto, nos trouxe Optional, pensei em oferecer uma solução usando ele (e Streame Collectors):
public enum PcapLinkType {
DLT_NULL(0),
DLT_EN3MB(2),
DLT_AX25(3),
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é como null: representa um caso em que não há valor (válido). Mas é uma alternativa mais segura para o tipo nullou um valor padrão, como DLT_UNKNOWNporque você pode esquecer de verificar os casos nullou DLT_UNKNOWN. Ambos são PcapLinkTypevalores válidos ! Em contraste, você não pode atribuir um Optional<PcapLinkType>valor a uma variável do tipo PcapLinkType. Optionalfaz com que você verifique um valor válido primeiro.
Claro, se você quiser manter DLT_UNKNOWNpara compatibilidade com versões anteriores ou qualquer outro motivo, você ainda pode usar, Optionalmesmo nesse caso, usando orElse()para especificá-lo como o valor padrão:
public enum PcapLinkType {
DLT_NULL(0),
DLT_EN3MB(2),
DLT_AX25(3),
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);
}
}