Ich weiß, dass diese Frage ein paar Jahre alt ist, aber da Java 8 uns inzwischen gebracht hat Optional, dachte ich, ich würde eine Lösung anbieten, die es (und Streamund Collectors) verwendet:
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));
}
}
Optionalist wie null: Es stellt einen Fall dar, in dem es keinen (gültigen) Wert gibt. Es ist jedoch eine typsichere Alternative zu nulloder ein Standardwert, z. B. DLT_UNKNOWNweil Sie vergessen könnten, nach nulloder zu DLT_UNKNOWNsuchen. Sie sind beide gültige PcapLinkTypeWerte! Im Gegensatz dazu können Sie Optional<PcapLinkType>einer Variablen vom Typ keinen Wert zuweisen PcapLinkType. OptionalLässt Sie zuerst nach einem gültigen Wert suchen.
Wenn Sie aus DLT_UNKNOWNGründen der Abwärtskompatibilität oder aus einem anderen Grund beibehalten möchten, können Sie dies natürlich Optionalauch in diesem Fall verwenden, indem Sie orElse()es als Standardwert angeben:
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);
}
}