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.
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).
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
*/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 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);}
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:
n'utilisez jamais le sexe comme nom de classe, il est difficile de lire votre code, nous utilisons le sexe en Java
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
La méthode est définie implicitement (c'est-à-dire générée par le compilateur).
Depuis le JLS :
la source
Added by the compiler
signifie 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()
Lance ça
tu verras
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:
n'utilisez jamais le sexe comme nom de classe, il est difficile de lire votre code, nous utilisons le sexe en Java
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
la source