Je sais que cette question date de quelques années, mais comme Java 8 nous a, entre-temps, amené Optional
, j'ai pensé proposer une solution en l'utilisant (et Stream
et 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
est comme null
: il représente un cas où il n'y a pas de valeur (valide). Mais c'est une alternative plus sûre pour le type null
ou une valeur par défaut, par exemple DLT_UNKNOWN
parce que vous pourriez oublier de vérifier les cas null
ou DLT_UNKNOWN
. Ce sont deux PcapLinkType
valeurs valides ! En revanche, vous ne pouvez pas affecter une Optional<PcapLinkType>
valeur à une variable de type PcapLinkType
. Optional
vous fait vérifier d'abord une valeur valide.
Bien sûr, si vous souhaitez conserver DLT_UNKNOWN
pour compatibilité descendante ou pour toute autre raison, vous pouvez toujours utiliser Optional
même dans ce cas, en utilisant orElse()
pour le spécifier comme valeur par défaut:
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);
}
}