web-dev-qa-db-fra.com

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

Je déclare un enum comme:

enum Sex {MALE,FEMALE};

Et ensuite, itérer 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

163
rai.skumar

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

Documenté à 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 dans l'ordre dans lequel elles ont été déclarées. Cette méthode est couramment utilisée en combinaison avec la construction for-each pour parcourir les valeurs d'un type enum.

  • Enum.valueOf classe
    (La méthode spéciale implicite values est mentionnée dans la description de la méthode valueOf)

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

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

170
Denys Séguret

Le procédé est défini implicitement (c’est-à-dire généré par le compilateur).

De la JLS :

De plus, si E est le nom d'un type enum, alors ce type comporte implicitement les méthodes static 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);
31
NPE

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 la classe "sexe" a. 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 Sex in Java

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

12
Evgeniy Dorofeev