@ScottF Möchten Sie, wie Aufzählungen verwendet werden?
Anish B.
In der oberen Antwort gibt es eine Aufzählungsdefinition. Ich möchte ein Beispiel dafür, wie diese definierte Aufzählung im Code verwendet wird. Wie würde beispielsweise der definierte ctor verwendet, um eine Aufzählungsinstanz mit einem bestimmten ganzzahligen Wert zu erstellen?
ScottF
@ScottF Wenn ich Sie wäre, würde ich lieber eine völlig neue Frage stellen, anstatt ein Kopfgeld für diesen Beitrag zu setzen ..... oder die Dokumentation über Aufzählungen lesen. Es scheint, dass Sie einige
Kernkenntnisse darüber
enum ids {OPEN = 100, CLOSE};?
Herr Oscar
Antworten:
307
Java-Enums sind nicht wie C- oder C ++ - Enums, die eigentlich nur Bezeichnungen für Ganzzahlen sind.
Java-Enums werden eher wie Klassen implementiert - und sie können sogar mehrere Attribute haben.
Der große Unterschied besteht darin, dass sie typsicher sind, sodass Sie sich keine Gedanken über die Zuweisung einer COLOR-Enumeration zu einer SIZE-Variablen machen müssen.
Basierend auf Ihrer Aussage wäre es die beste Vorgehensweise, mit Java eine Aufzählung von sequentiellen Ganzzahlen (ähnlich einer C ++ - Aufzählung) für einen Index in ein Array oder etwas anderes zu erstellen, Folgendes zu schreiben: enum Ids {NAME (0), AGE (1 ), HÖHE (2), GEWICHT (3); } Danke, -bn
bn.
Möglicherweise und besonders, wenn Sie die Integralwerte jemals irgendwo serialisieren.
Lavinio
1
Können Sie bitte sagen, wie diese Aufzählung in einer Funktion verwendet wird?
Bugs passieren
2
Es ist faul von den Java-Standards, nicht zuzulassen, dass ein Wert für eine Aufzählung festgelegt wird. Zumindest c # erlaubt dies UND ist typsicher.
Schmied
2
FWIW, C ++ 11 hat jetzt eine typsichere Funktion enum class.
Phoenix
92
Ja. Sie können die numerischen Werte wie folgt an den Konstruktor für die Aufzählung übergeben:
Cool. Kann man mischen? Dh nur ausgewählten Enum-Werten Zahlen zuweisen.
Frederick Nord
privater Modifikator ist für Enum-Konstruktoren redundant
Nino van Hooff
@ FrederickNord - Sicher. Fügen Sie einfach einen zweiten privaten Konstruktor ohne Argumente hinzu, der valuemit einer (sagen wir) Null initialisiert wird . Nehmen Sie dann (sagen wir) DANCEin die Werteliste auf.
Beachten Sie, dass diese beiden Methoden weniger Speicher und mehr Prozesseinheiten verbrauchen. Ich sage nicht, dass dies der beste Weg ist, aber es ist nur ein anderer Ansatz.
Warum wird getColorValue()im zweiten Beispiel synchronisiert?
Josaphatv
@josaphatv Alle Funktionen im zweiten Beispiel sind statisch und ändern sich nie. Möglicherweise möchten Sie, HL_COLORS.getColorValue(HL_COLORS.YELLOW);ohne die Aufzählung zu initialisieren.
Mazunki
11
Wenn Sie sehr große Aufzählungstypen verwenden, kann Folgendes hilfreich sein.
Die Funktion ordinal () gibt die relative Position des Bezeichners in der Aufzählung zurück. Sie können dies verwenden, um eine automatische Indizierung mit einem Versatz zu erhalten, wie bei einer Aufzählung im C-Stil.
Bearbeiten: Ich habe gerade festgestellt, dass dies der Antwort von ggrandes sehr ähnlich ist , aber ich werde es hier belassen, weil es sehr sauber und ungefähr so nah wie möglich an einer Aufzählung im C-Stil ist.
Im Beispiel nehmen Sie eine Aufzählung und erhalten eine int. Können Sie das Gegenteil zeigen, ein int nehmen und am Ende eine Aufzählung erhalten (ohne explizite Umschaltung für jeden Wert?)
ScottF
Gemäß der Frage halte ich dies für die am besten geeignete Antwort. Hier haben wir den Standardindex von enum so geändert, dass er bei 100 beginnt, ohne eine neue Variable zu definieren und diese über den Konstruktor zuzuweisen.
Rahul Jain
@ RahulJain Ich würde lieber die akzeptierte Antwort verwenden. Es scheint mir sauberer.
Lealceldeiro
1
@scottf
Eine Aufzählung ist wie ein Singleton. Die JVM erstellt die Instanz.
Wenn Sie es selbst mit Klassen erstellen würden, könnte es so aussehen
publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}
Und könnte so verwendet werden:
publicclassHelloWorld{publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}publicstaticvoid main(String[]args){System.out.println(MyEnum.ONE);System.out.println(MyEnum.TWO);System.out.println(MyEnum.ONE ==MyEnum.ONE);System.out.println("Hello World");}}
@scottf, Sie haben wahrscheinlich wegen des in der ENUM definierten Konstruktors verwirrt.
Lassen Sie mich das erklären.
Wenn eine Klasse class loadergeladen wird enum, wird auch der enumKonstruktor aufgerufen. Auf was!! Ja, es ist aufgerufen OPENund close. Mit welchen Werten 100für OPENund 200fürclose
Aber es ist eine schlechte Praxis. enumwird zur Darstellung von constantslike verwendet days of week, colors in rainbowdh einer solchen kleinen Gruppe vordefinierter Konstanten.
enum ids {OPEN = 100, CLOSE};
?Antworten:
Java-Enums sind nicht wie C- oder C ++ - Enums, die eigentlich nur Bezeichnungen für Ganzzahlen sind.
Java-Enums werden eher wie Klassen implementiert - und sie können sogar mehrere Attribute haben.
Der große Unterschied besteht darin, dass sie typsicher sind, sodass Sie sich keine Gedanken über die Zuweisung einer COLOR-Enumeration zu einer SIZE-Variablen machen müssen.
Weitere Informationen finden Sie unter http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html .
quelle
enum class
.Ja. Sie können die numerischen Werte wie folgt an den Konstruktor für die Aufzählung übergeben:
Weitere Informationen finden Sie im Sun Java Language Guide .
quelle
value
mit einer (sagen wir) Null initialisiert wird . Nehmen Sie dann (sagen wir)DANCE
in die Werteliste auf.Was ist mit dieser Methode:
Es gibt nur eine Methode.
Sie können die statische Methode verwenden und die Aufzählung als Parameter wie folgt übergeben:
Beachten Sie, dass diese beiden Methoden weniger Speicher und mehr Prozesseinheiten verbrauchen. Ich sage nicht, dass dies der beste Weg ist, aber es ist nur ein anderer Ansatz.
quelle
getColorValue()
im zweiten Beispiel synchronisiert?HL_COLORS.getColorValue(HL_COLORS.YELLOW);
ohne die Aufzählung zu initialisieren.Wenn Sie sehr große Aufzählungstypen verwenden, kann Folgendes hilfreich sein.
quelle
Wenn Sie eine Aufzählung von C / C ++ emulieren möchten (Basisnummern und Nexte-Inkrementale):
quelle
Die Funktion ordinal () gibt die relative Position des Bezeichners in der Aufzählung zurück. Sie können dies verwenden, um eine automatische Indizierung mit einem Versatz zu erhalten, wie bei einer Aufzählung im C-Stil.
Beispiel:
Gibt die Ausgabe:
Bearbeiten: Ich habe gerade festgestellt, dass dies der Antwort von ggrandes sehr ähnlich ist , aber ich werde es hier belassen, weil es sehr sauber und ungefähr so nah wie möglich an einer Aufzählung im C-Stil ist.
quelle
@scottf
Eine Aufzählung ist wie ein Singleton. Die JVM erstellt die Instanz.
Wenn Sie es selbst mit Klassen erstellen würden, könnte es so aussehen
Und könnte so verwendet werden:
quelle
@scottf, Sie haben wahrscheinlich wegen des in der ENUM definierten Konstruktors verwirrt.
Lassen Sie mich das erklären.
Wenn eine Klasse
class loader
geladen wirdenum
, wird auch derenum
Konstruktor aufgerufen. Auf was!! Ja, es ist aufgerufenOPEN
undclose
. Mit welchen Werten100
fürOPEN
und200
fürclose
Kann ich einen anderen Wert haben?
Ja,
Aber es ist eine schlechte Praxis.
enum
wird zur Darstellung vonconstants
like verwendetdays of week
,colors in rainbow
dh einer solchen kleinen Gruppe vordefinierter Konstanten.quelle
Ich denke, Sie sind verwirrt, wenn Sie sich C ++ - Enumeratoren ansehen. Java-Enumeratoren sind unterschiedlich.
Dies wäre der Code, wenn Sie an C / C ++ - Aufzählungen gewöhnt sind:
quelle