Я знаю, що цьому питанню кілька років, але оскільки Java 8 нас тим часом принесла Optional, я подумав запропонувати рішення, використовуючи його (та Streamі 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подібний 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),
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);
}
}