我知道这个问题已经有几年的历史了,但与此同时,Java 8 给我们带来了Optional,我想我会提供一个使用它的解决方案(以及Stream 和Collectors) :
public enum PcapLinkType {
DLT_NULL(0),
DLT_EN3MB(2),
DLT_AX25(3),
/*snip, 200 more enums, not always consecutive.*/
// DLT_UNKNOWN(-1); // <--- NO LONGER NEEDED
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),
/*snip, 200 more enums, not always consecutive.*/
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);
}
}