Wo ist die Dokumentation für die values ​​() -Methode von Enum?

172

Ich erkläre eine Aufzählung als:

enum Sex {MALE,FEMALE};

Und dann iterieren Sie die Aufzählung wie unten gezeigt:

for(Sex v : Sex.values()){
    System.out.println(" values :"+ v);
}

Ich habe die Java-API überprüft, kann aber die Methode values ​​() nicht finden. Ich bin gespannt, woher diese Methode kommt.

API-Link: https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html

rai.skumar
quelle

Antworten:

178

Sie können diese Methode in Javadoc nicht sehen, da sie vom Compiler hinzugefügt wurde.

An drei Stellen dokumentiert:

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.

Die valuesFunktion listet einfach alle Werte der Aufzählung auf.

Denys Séguret
quelle
6
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).

Aus dem JLS :

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
*/
public static 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
*/
public static E valueOf(String name);
NPE
quelle
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);
    }

du wirst sehen

public static test.Sex test.Sex.valueOf(java.lang.String)
public static test.Sex[] test.Sex.values()

Dies sind alles öffentliche Methoden, die die "Sex" -Klasse hat. Sie sind nicht im Quellcode enthalten, javac.exe hat sie hinzugefügt

Anmerkungen:

  1. Verwenden Sie niemals Sex als Klassennamen. Es ist schwierig, Ihren Code zu lesen. Wir verwenden Sex in Java

  2. 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

Evgeniy Dorofeev
quelle