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
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
classevalues
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.
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 typeenum
, alors ce type comporte implicitement les méthodesstatic
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);
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:
n'utilisez jamais le sexe comme nom de classe, il est difficile de lire votre code, nous utilisons Sex in Java
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