Tôi biết câu hỏi này đã có từ vài năm trước, nhưng vì Java 8, trong khi chờ đợi, đã mang lại cho chúng tôi Optional, tôi nghĩ tôi sẽ đưa ra một giải pháp bằng cách sử dụng nó (và Streamvà 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));
}
}
Optionalgiống như null: nó đại diện cho một trường hợp khi không có giá trị (hợp lệ). Nhưng nó là một sự thay thế an toàn hơn cho kiểu nullhoặc một giá trị mặc định, chẳng hạn như DLT_UNKNOWNvì bạn có thể quên kiểm tra nullhoặc DLT_UNKNOWNcác trường hợp. Cả hai đều là PcapLinkTypegiá trị hợp lệ ! Ngược lại, bạn không thể gán Optional<PcapLinkType>giá trị cho biến kiểu PcapLinkType. Optionalkhiến bạn kiểm tra giá trị hợp lệ trước.
Tất nhiên, nếu bạn muốn giữ lại DLT_UNKNOWNđể tương thích ngược hoặc bất kỳ lý do nào khác, bạn vẫn có thể sử dụng Optionalngay cả trong trường hợp đó, sử dụng orElse()để chỉ định nó làm giá trị mặc định:
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);
}
}