ฉันรู้ว่าคำถามนี้มีอายุไม่กี่ปี แต่ในขณะที่ 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);
}
}