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à Stream
và 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
giố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 null
hoặc một giá trị mặc định, chẳng hạn như DLT_UNKNOWN
vì bạn có thể quên kiểm tra null
hoặc DLT_UNKNOWN
các trường hợp. Cả hai đều là PcapLinkType
giá 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
. Optional
khiế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 Optional
ngay 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);
}
}