Gibt es eine C-ähnliche Möglichkeit, die Artikelnummer von enum in Java zu erhalten?

8

Das ist eine einfache Grundfrage

Eine enum haben

%Vor%

Kann ich die Bestellnummer für Beispiel ID = 0, GROUP = 2, DATA = 3, FAIL = 4?

erhalten

Dies ist ein Weg dazu, aber ein seltsamer und langer! = S

%Vor%

um Zahlen zu bekommen, schreibe ich TK.ID.get (), TK.GROUP.get (), etc ... Ich mag das nicht

gibt es einen besseren Weg?

(C enums, C Makros .. Ich vermisse dich beide)

Danke

    
Hernán Eche 04.05.2010, 13:29
quelle

5 Antworten

7

Suchen Sie nach ordinal ?

    
ChristopheD 04.05.2010, 13:32
quelle
14

Die ordinal() macht was du machen willst. Dies ist ein Auszug aus der Dokumentation:

  

Gibt die Ordnungszahl dieser Enumerationskonstante zurück (ihre Position in der Deklaration enum , wobei der Anfangskonstante eine Ordinalzahl von Null zugewiesen wird). Die meisten Programmierer werden für diese Methode keine Verwendung haben. Sie ist für die Verwendung in komplexen enumbasierten Datenstrukturen vorgesehen, wie zB EnumSet und EnumMap .

Josh Bloch in Effektive Java 2nd Edition geht weiter, um zu erklären, warum die Verwendung von ordinal() eine schreckliche Idee ist. Hier sind einige Zitate, leicht bearbeitet:

  

Leiten Sie niemals einen Wert, der einer Aufzählung zugeordnet ist, von seiner Ordnungszahl ab; Speichern Sie es stattdessen in einem Instanzfeld. ( Punkt 31: Verwenden von Instanzfeldern anstelle von Ordinalzahlen ) Es ist selten sinnvoll, Ordnungszahlen zum Indexieren von Arrays zu verwenden: Verwenden Sie stattdessen EnumMap . Das allgemeine Prinzip ist, dass Anwendungsprogrammierer selten, wenn überhaupt, Enum.ordinal verwenden sollten. ( Punkt 33: Verwenden Sie EnumMap anstelle der Ordinalindizierung )

Ihr "seltsamer und langer" Weg ist genau das Rezept von Punkt 31.

Glücklicherweise ist Java nicht C. Ein Java enum ist sehr mächtig und flexibel, wird von vielen Bibliotheksklassen unterstützt und Sie sollten lernen, sie zu akzeptieren, anstatt ordinal() zu verwenden.

Sehen Sie sich zum Beispiel EnumMap an.

  

Eine spezielle Implementierung Map zur Verwendung mit enum Typ Schlüssel. Alle Schlüssel in einer enum -Karte müssen aus einem einzigen enum -Typ stammen, der explizit oder implizit beim Erstellen der Map angegeben wird. Enum Maps werden intern als Arrays dargestellt. Diese Darstellung ist äußerst kompakt und effizient.

Das heißt, anstelle der folgenden (was Sie vielleicht tun wollten):

%Vor%

Sie können stattdessen tun:

%Vor%

Das Buch deckt auch eine andere "traditionelle" (ab) Verwendung von enum in C ab, d. h. Bitfelder (Zuweisen von Potenzen von 2 zu jeder Konstante usw.). Nun, dafür hat Java stattdessen EnumSet .

>     
polygenelubricants 04.05.2010 14:19
quelle
2

Sie können ordinal ()

verwenden     
Uri 04.05.2010 13:33
quelle
2
%Vor%

ist der Weg, wo tk eine Instanz von TK

ist

Ссылка

    
Yaneeve 04.05.2010 13:33
quelle
1

Ссылка

  

öffentliches final int ordinal ()
  Gibt die Ordinalzahl dieser Enumerationskonstante zurück (ihre Position in der Enum-Deklaration, wobei der Anfangskonstanten eine Ordinalzahl von Null zugewiesen wird). Die meisten Programmierer werden für diese Methode keine Verwendung haben. Es ist für den Einsatz von anspruchsvollen Enum-basierten Datenstrukturen wie EnumSet und EnumMap ausgelegt.

    
Bert F 04.05.2010 13:35
quelle

Tags und Links