Ich habe eine Aufzählung wie diese:
public enum PcapLinkType {
DLT_NULL(0)
DLT_EN10MB(1)
DLT_EN3MB(2),
DLT_AX25(3),
/*snip, 200 more enums, not always consecutive.*/
DLT_UNKNOWN(-1);
private final int value;
PcapLinkType(int value) {
this.value= value;
}
}
Jetzt bekomme ich ein Int von der externen Eingabe und möchte die passende Eingabe - eine Ausnahme auszulösen, wenn ein Wert nicht existiert, ist in Ordnung, aber vorzugsweise hätte ich es DLT_UNKNOWN
in diesem Fall.
int val = in.readInt();
PcapLinkType type = ???; /*convert val to a PcapLinkType */
EnumMap
verwendet die Aufzählungen als Schlüssel. In diesem Fall möchte das OP die Aufzählungen als Werte.values()
(wenn Ihre Aufzählungswerte sequentiell sind) oder eine einfacheswitch
Anweisung diese Methode leicht übertreffen . Wenn Sie nur eine Handvoll Einträge in IhremEnum
Verzeichnis haben, ist es wenig sinnvoll, den Overhead einer HashMap hinzuzufügen, nur um dieswitch
Anweisung nicht aktualisieren zu müssen . Diese Methode mag eleganter erscheinen, ist aber auch verschwenderisch.Es gibt eine statische Methode ,
values()
die ist dokumentiert, aber nicht , wo man es erwarten würde: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.htmlIm Prinzip können Sie nur verwenden
values()[i]
, aber es gibt Gerüchte, dassvalues()
bei jedem Aufruf eine Kopie des Arrays erstellt wird.quelle
Sie müssen eine neue statische Methode erstellen, bei der Sie PcapLinkType.values () iterieren und vergleichen:
Das wäre in Ordnung, wenn es selten genannt wird. Wenn es häufig aufgerufen wird, sehen Sie sich die
Map
von anderen vorgeschlagene Optimierung an.quelle
Sie können so etwas tun, um sie alle automatisch in einer Sammlung zu registrieren, mit der Sie dann die Ganzzahlen einfach in die entsprechende Aufzählung konvertieren können. (Übrigens ist es nicht erlaubt , sie der Karte im Enum-Konstruktor hinzuzufügen . Es ist schön, auch nach vielen Jahren mit Java neue Dinge zu lernen. :)
quelle
wenn du so eine Aufzählung hast
dann kannst du es gerne benutzen
quelle
Wie @MeBigFatGuy sagt, außer dass Sie Ihren
static {...}
Block dazu bringen können, eine Schleife über dievalues()
Sammlung zu verwenden:quelle
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 (undStream
undCollectors
) verwendet:Optional
ist wienull
: Es stellt einen Fall dar, in dem es keinen (gültigen) Wert gibt. Es ist jedoch eine typsichere Alternative zunull
oder ein Standardwert, z. B.DLT_UNKNOWN
weil Sie vergessen könnten, nachnull
oder zuDLT_UNKNOWN
suchen. Sie sind beide gültigePcapLinkType
Werte! Im Gegensatz dazu können SieOptional<PcapLinkType>
einer Variablen vom Typ keinen Wert zuweisenPcapLinkType
.Optional
Lässt Sie zuerst nach einem gültigen Wert suchen.Wenn Sie aus
DLT_UNKNOWN
Gründen der Abwärtskompatibilität oder aus einem anderen Grund beibehalten möchten, können Sie dies natürlichOptional
auch in diesem Fall verwenden, indem SieorElse()
es als Standardwert angeben:quelle
Sie können Ihrer Aufzählung eine statische Methode hinzufügen, die a
int
als Parameter akzeptiert und a zurückgibtPcapLinkType
.quelle
switch
Anweisung einen Eintrag hinzuzufügen, wenn Sie eine neue Aufzählung hinzufügen. Nicht ideal, IMHO.Das benutze ich:
quelle
quelle
.values()
Methode definieren ?).--int
, aber es ist offensichtlich ein Tippfehler.null
anstelle vonDLT_UKNOWN
:)static final values[] = PcapLinkType.values()
?Es gibt keine Möglichkeit, ganzzahlige Aufzählungstypen elegant zu behandeln. Möglicherweise möchten Sie anstelle Ihrer Lösung eine auf Zeichenfolgen basierende Aufzählung verwenden. Nicht immer ein bevorzugter Weg, aber er existiert immer noch.
quelle