Wiem, że to pytanie ma już kilka lat, ale ponieważ Java 8 w międzyczasie nas przyniosła Optional, pomyślałem, że zaproponuję rozwiązanie, które go wykorzysta ( Streami 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));
}
}
Optionaljest jak null: reprezentuje przypadek, gdy nie ma (prawidłowej) wartości. Ale jest to bardziej bezpieczna dla typu alternatywa nulllub wartość domyślna, na przykład DLT_UNKNOWNponieważ można zapomnieć o sprawdzeniu przypadków nulllub DLT_UNKNOWN. Obie są poprawnymi PcapLinkTypewartościami! Natomiast nie można przypisać Optional<PcapLinkType>wartości do zmiennej typu PcapLinkType. Optionalpowoduje, że najpierw sprawdzasz prawidłową wartość.
Oczywiście, jeśli chcesz zachować DLT_UNKNOWNzgodność ze starszymi wersjami lub z jakiegokolwiek innego powodu, nadal możesz użyć Optionalnawet w tym przypadku, używając, orElse()aby określić to jako wartość domyślną:
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);
}
}