Où est la documentation de la méthode values ​​() de Enum?

172

Je déclare une énumération comme:

enum Sex {MALE,FEMALE};

Et puis, itérez enum comme indiqué ci-dessous:

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

J'ai vérifié l'API Java mais je ne trouve pas la méthode values ​​()? Je suis curieux de savoir d'où vient cette méthode?

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

rai.skumar
la source

Réponses:

178

Vous ne pouvez pas voir cette méthode dans javadoc car elle est ajoutée par le compilateur.

Documenté en trois endroits:

Le compilateur ajoute automatiquement des méthodes spéciales lorsqu'il crée une énumération. Par exemple, ils ont une méthode de valeurs statiques qui renvoie un tableau contenant toutes les valeurs de l'énumération dans l'ordre dans lequel elles sont déclarées. Cette méthode est couramment utilisée en combinaison avec la construction for-each pour itérer sur les valeurs d'un type enum.

  • Enum.valueOfclass
    (La valuesméthode implicite spéciale est mentionnée dans la description de la valueOfméthode)

Toutes les constantes d'un type enum peuvent être obtenues en appelant la méthode implicite public static T [] values ​​() de ce type.

La valuesfonction liste simplement toutes les valeurs de l'énumération.

Denys Séguret
la source
6
une raison spécifique à cela? pourquoi cela ne fait pas partie de l'API?
rai.skumar
10
Parce qu'en utilisant uniquement le mécanisme standard (sans enum), vous ne pourriez pas avoir cette méthode statique. La spécification java a dû être étendue pour permettre ces énumérations, c'est pourquoi elle doit être ajoutée par le compilateur.
Denys Séguret
4
Depuis Java 7, cela a été ajouté au javadoc de java.lang.Enum, dans la description de la méthode statique valuOf.
Catweazle
3
L'appel de "values ​​()" crée-t-il un nouveau tableau, ou réutilise-t-il le même?
développeur android
3
@androiddeveloper il renvoie un nouveau tableau (sinon vous risquez de jouer avec l'énumération)
Denys Séguret
35

La méthode est définie implicitement (c'est-à-dire générée par le compilateur).

Depuis le JLS :

De plus, si Eest le nom d'un enumtype, alors ce type a les staticméthodes implicitement déclarées suivantes :

/**
* 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
la source
Added by the compilersignifie qu'il n'y a pas de .java pour ce code ou que le code est généré par le compilateur? J'ai vérifié le code source OpenJDK d'Enum et il n'y a pasvalues()
Marco Sulla
12

Lance ça

    for (Method m : sex.class.getDeclaredMethods()) {
        System.out.println(m);
    }

tu verras

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

Ce sont toutes des méthodes publiques que possède la classe "sex". Ils ne sont pas dans le code source, javac.exe les a ajoutés

Remarques:

  1. n'utilisez jamais le sexe comme nom de classe, il est difficile de lire votre code, nous utilisons le sexe en Java

  2. face à un puzzle Java comme celui-ci, je recommande d'utiliser un outil de décompilation de bytecode (j'utilise le plugin bytecode contour Eclispe d'Andrey Loskutov). Cela montrera tout ce qu'il y a à l'intérieur d'une classe

Evgeniy Dorofeev
la source