Ich habe den Aufzählungstyp ReportTypeEnum
, der zwischen Methoden in allen meinen Klassen übergeben wird, aber ich muss ihn dann an die URL übergeben, damit ich die ordinale Methode verwende, um den int-Wert zu erhalten. Nachdem ich es auf meiner anderen JSP-Seite erhalten habe, muss ich es wieder in eine konvertieren, ReportTypeEnum
damit ich es weiter übergeben kann.
Wie kann ich Ordnungszahlen in konvertieren ReportTypeEnum
?
Verwenden von Java 6 SE.
Antworten:
Um eine Ordnungszahl in ihre Aufzählung umzuwandeln, möchten Sie möglicherweise Folgendes tun:
Bitte beachten Sie die Array-Grenzen.
Beachten Sie, dass jeder Aufruf von
values()
ein neu geklontes Array zurückgibt, was sich negativ auf die Leistung auswirken kann. Möglicherweise möchten Sie das Array zwischenspeichern, wenn es häufig aufgerufen wird.Codebeispiel zum Zwischenspeichern
values()
.Diese Antwort wurde bearbeitet, um das Feedback in die Kommentare aufzunehmen
quelle
Dies ist mit ziemlicher Sicherheit eine schlechte Idee . Wenn die Ordnungszahl de facto beibehalten wird (z. B. weil jemand die URL mit einem Lesezeichen versehen hat), bedeutet dies, dass Sie die
enum
Reihenfolge in Zukunft immer beibehalten müssen , was für Code-Betreuer auf der ganzen Linie möglicherweise nicht offensichtlich ist.Warum nicht stattdessen die
enum
Verwendung verschlüsselnmyEnumValue.name()
(und über dekodierenReportTypeEnum.valueOf(s)
)?quelle
value
entweder am Anfang oder an der richtigen alphabetischen / logischen Position ein a hinzufügt . (Mit logisch meine ich zum Beispiel, dassTimeUnit
Werte eine logische Position haben)Wenn ich
values()
viel verwenden werde:Inzwischen überall.java:
Achten Sie auf Ihre Array-Grenzen.
quelle
Suit.values[0] = Suit.Diamonds;
irgendwo in Ihrem Code. Im Idealfall wird dies niemals passieren, aber das allgemeine Prinzip , keine veränderlichen Felder freizulegen, gilt weiterhin. Erwägen Sie für diesen AnsatzCollections.unmodifiableList
stattdessen die Verwendung von oder dergleichen.Suit values[]
direkt oder indirekt (wie durch erwähntgetValues()
) aufzudecken. Ich arbeite mit einer öffentlichen Methode herum, bei der derordinal
Wert wie ein Argument gesendet werden muss und dieSuit
Darstellung von zurückgibtSuit values[]
. Der Punkt hier (Fragekachel von Anfang an) war das Erstellen eines Aufzählungstyps aus einer AufzählungszahlIch stimme den meisten Menschen zu, dass die Verwendung von Ordnungszahlen wahrscheinlich eine schlechte Idee ist. Normalerweise löse ich dieses Problem, indem ich der Aufzählung einen privaten Konstruktor gebe, der beispielsweise einen DB-Wert annehmen und dann eine statische
fromDbValue
Funktion erstellen kann, die der in Jan's Antwort ähnelt.Jetzt können Sie die Reihenfolge ändern, ohne die Suche zu ändern, und umgekehrt.
quelle
Sie können eine statische Nachschlagetabelle verwenden:
quelle
0...(n-1)
, ist ein Array weniger Code und auch besser lesbar. Der Leistungsschub ist nur ein Bonus.private static final Suit[] VALUES = values();
undpublic Suit fromOrdinal(int ordinal) { return VALUES[ordinal]; }
. Zusätzlicher Vorteil: Stürzt sofort bei ungültigen Ordnungszahlen ab, anstatt stillschweigend null zurückzugeben. (Nicht immer ein Vorteil. Aber oft.)Das benutze ich. Ich gebe nicht vor, dass es weit weniger "effizient" ist als die einfacheren Lösungen oben. Es wird eine viel klarere Ausnahmemeldung als "ArrayIndexOutOfBounds" angezeigt, wenn in der obigen Lösung ein ungültiger Ordnungswert verwendet wird.
Es nutzt die Tatsache, dass EnumSet javadoc angibt, dass der Iterator Elemente in ihrer natürlichen Reihenfolge zurückgibt. Es gibt eine Behauptung, wenn das nicht richtig ist.
Der JUnit4-Test zeigt, wie er verwendet wird.
quelle
Das mache ich auf Android mit Proguard:
Es ist kurz und ich muss mir keine Sorgen um eine Ausnahme in Proguard machen
quelle
Sie können eine einfache Methode definieren wie:
Und benutze es wie:
quelle
die Testklasse
Ich weiß es zu schätzen, dass Sie uns mitteilen, wenn Sie einen effizienteren Code haben. Meine Aufzählung ist riesig und wird ständig tausende Male aufgerufen.
quelle
Eine Möglichkeit besteht darin,
ExampleEnum valueOfOrdinal = ExampleEnum.values()[ordinal];
das zu tun, was funktioniert, und es ist einfach, wie bereits erwähnt,ExampleEnum.values()
für jeden Aufruf ein neues geklontes Array zurückzugeben. Das kann unnötig teuer sein. Wir können das lösen, indem wir das Array so zwischenspeichernExampleEnum[] values = values()
. Es ist auch "gefährlich", unser zwischengespeichertes Array ändern zu lassen. Jemand könnte schreibenExampleEnum.values[0] = ExampleEnum.type2;
Also würde ich es mit einer Accessor-Methode privat machen, die kein zusätzliches Kopieren durchführt.Sie würden verwenden
ExampleEnum.value(ordinal)
, um den zugeordneten Aufzählungswert zu erhaltenordinal
quelle
Jede Aufzählung hat name (), was eine Zeichenfolge mit dem Namen des Aufzählungsmitglieds angibt.
Gegeben
enum Suit{Heart, Spade, Club, Diamond}
,Suit.Heart.name()
wird gebenHeart
.Jede Aufzählung hat eine
valueOf()
Methode, die einen Aufzählungstyp und eine Zeichenfolge verwendet, um die umgekehrte Operation auszuführen:Enum.valueOf(Suit.class, "Heart")
kehrt zurückSuit.Heart
.Warum jemand Ordnungszahlen verwenden würde, ist mir ein Rätsel. Es kann Nanosekunden schneller sein, aber es ist nicht sicher, wenn sich die Enum-Mitglieder ändern, da ein anderer Entwickler möglicherweise nicht weiß, dass ein Code auf Ordnungswerten basiert (insbesondere auf der in der Frage zitierten JSP-Seite dominiert der Netzwerk- und Datenbank-Overhead die Zeit, keine Ganzzahl über einer Zeichenfolge verwenden).
quelle