Der Compiler fügt beim Erstellen einer Aufzählung automatisch einige spezielle Methoden hinzu. Beispielsweise verfügen sie über eine statische Wertemethode, die ein Array zurückgibt, das alle Werte der Aufzählung in der Reihenfolge enthält, in der sie deklariert sind. Diese Methode wird üblicherweise in Kombination mit dem for-each-Konstrukt verwendet, um die Werte eines Aufzählungstyps zu durchlaufen.
Enum.valueOfKlasse (Die spezielle implizite valuesMethode wird in der Beschreibung der valueOfMethode erwähnt.)
Alle Konstanten eines Aufzählungstyps können durch Aufrufen der impliziten öffentlichen statischen T [] values () -Methode dieses Typs erhalten werden.
Gibt es einen bestimmten Grund dafür? Warum ist es nicht Teil der API?
rai.skumar
10
Da Sie nur den Standardmechanismus (ohne Aufzählung) verwenden, können Sie diese statische Methode nicht verwenden. Die Java-Spezifikation musste erweitert werden, um diese Aufzählungen zu ermöglichen. Deshalb muss sie vom Compiler hinzugefügt werden.
Denys Séguret
4
Seit Java 7 wurde dies dem javadoc von java.lang.Enum in der Beschreibung der statischen valueOf-Methode hinzugefügt.
Catweazle
3
Erstellt der Aufruf von "values ()" ein neues Array oder wird dasselbe wiederverwendet?
Android-Entwickler
3
@androiddeveloper es gibt ein neues Array zurück (sonst könnten Sie mit der Aufzählung herumspielen)
Denys Séguret
35
Die Methode ist implizit definiert (dh vom Compiler generiert).
Wenn Ees sich um den Namen eines enumTyps handelt, verfügt dieser Typ außerdem über die folgenden implizit deklarierten staticMethoden:
/**
* Returns an array containing the constants of this enum
* type, in the order they're declared. This method may be
* used to iterate over the constants as follows:
*
* for(E c : E.values())
* System.out.println(c);
*
* @return an array containing the constants of this enum
* type, in the order they're declared
*/publicstatic E[] values();/**
* Returns the enum constant of this type with the specified
* name.
* The string must match exactly an identifier used to declare
* an enum constant in this type. (Extraneous whitespace
* characters are not permitted.)
*
* @return the enum constant with the specified name
* @throws IllegalArgumentException if this enum type has no
* constant with the specified name
*/publicstatic E valueOf(String name);
Added by the compilerbedeutet, dass es für diesen Code keine .java gibt oder der Code vom Compiler generiert wird? Ich habe den OpenJDK-Quellcode von Enum überprüft und es gibt keinenvalues()
Marco Sulla
12
Führen Sie dies aus
for(Method m : sex.class.getDeclaredMethods()){System.out.println(m);}
Dies sind alles öffentliche Methoden, die die "Sex" -Klasse hat. Sie sind nicht im Quellcode enthalten, javac.exe hat sie hinzugefügt
Anmerkungen:
Verwenden Sie niemals Sex als Klassennamen. Es ist schwierig, Ihren Code zu lesen. Wir verwenden Sex in Java
Wenn Sie sich einem Java-Puzzle wie diesem stellen, empfehle ich die Verwendung eines Bytecode-Dekompiler-Tools (ich verwende das Eclispe-Plugin für den Bytecode-Umriss von Andrey Loskutov). Dies zeigt alles, was sich in einer Klasse befindet
Die Methode ist implizit definiert (dh vom Compiler generiert).
Aus dem JLS :
quelle
Added by the compiler
bedeutet, dass es für diesen Code keine .java gibt oder der Code vom Compiler generiert wird? Ich habe den OpenJDK-Quellcode von Enum überprüft und es gibt keinenvalues()
Führen Sie dies aus
du wirst sehen
Dies sind alles öffentliche Methoden, die die "Sex" -Klasse hat. Sie sind nicht im Quellcode enthalten, javac.exe hat sie hinzugefügt
Anmerkungen:
Verwenden Sie niemals Sex als Klassennamen. Es ist schwierig, Ihren Code zu lesen. Wir verwenden Sex in Java
Wenn Sie sich einem Java-Puzzle wie diesem stellen, empfehle ich die Verwendung eines Bytecode-Dekompiler-Tools (ich verwende das Eclispe-Plugin für den Bytecode-Umriss von Andrey Loskutov). Dies zeigt alles, was sich in einer Klasse befindet
quelle