Je cherchais à travers la documentation et le code source, car je voulais être certain que les valeurs () renvoient toujours un tableau dans l'ordre dans lequel les valeurs ENUM sont déclarées. S'avère, ce n'est pas dans la documentation autant que je puisse dire.
J'ai vérifié le code source de la classe ENUM et pas de chance ( Il existe une méthode associée" gettvalues "). P>
Je suppose que certains compilateurs / interprète-foo se produisent déjà pour créer une classe qui s'étend enum de Une déclaration comme: p> de même est que les valeurs () sont également statilement traduites dans un tableau codé dur pendant la compilation? Ou est-ce en fait une méthode appelée à l'exécution, et si oui, où est-il défini? P> p>
4 Réponses :
frisson I> Je suis toujours rampée en voyant "Oracle's Enum Class" ou "L'Oracle Java". Cela me fait penser que vous parlez de la JVM qu'ils ont fait pour être utilisée dans des bases de données Oracle.
Maintenez le changement de nom jusqu'à ce que Oracle ait réellement effectué quelque chose de majeur pour Java.
LOL .... Si vous n'avez pas remarqué les gars, la plupart des sites sun.com code> sont maintenant
oracle.com code>. Pourrait aussi bien adopter aussi ...
Ha oui, je viens de googler pour ça. Je travaille sur Android, qui a la même méthode GetValues.
Comme vous pouvez le constater à partir du bytecode ci-dessous obtenu en désassemblant une énumération, la méthode jouroftheweek.java strong> p> Valeurs () CODE> sur l'ENUMS Retournez simplement une copie du tableau Static code> Statique Code> qui contient Toute la constante d'énumération déclarée. Ce tableau
Enum $ valeurs code> est rempli dans un bloc d'initialisation statique.
Compiled from "DaysOfTheWeek.java"
public final class DaysOfTheWeek extends java.lang.Enum{
public static final DaysOfTheWeek MONDAY;
public static final DaysOfTheWeek TUESDAY;
public static final DaysOfTheWeek WEDNESDAY;
public static final DaysOfTheWeek THURSDAY;
public static final DaysOfTheWeek FRIDAY;
public static final DaysOfTheWeek SATURDAY;
public static final DaysOfTheWeek SUNDAY;
static {};
Code:
0: new #1; //class DaysOfTheWeek
3: dup
4: ldc #18; //String MONDAY
6: iconst_0
7: invokespecial #19; //Method "<init>":(Ljava/lang/String;I)V
10: putstatic #23; //Field MONDAY:LDaysOfTheWeek;
13: new #1; //class DaysOfTheWeek
16: dup
17: ldc #25; //String TUESDAY
19: iconst_1
20: invokespecial #19; //Method "<init>":(Ljava/lang/String;I)V
23: putstatic #26; //Field TUESDAY:LDaysOfTheWeek;
26: new #1; //class DaysOfTheWeek
29: dup
30: ldc #28; //String WEDNESDAY
32: iconst_2
33: invokespecial #19; //Method "<init>":(Ljava/lang/String;I)V
36: putstatic #29; //Field WEDNESDAY:LDaysOfTheWeek;
39: new #1; //class DaysOfTheWeek
42: dup
43: ldc #31; //String THURSDAY
45: iconst_3
46: invokespecial #19; //Method "<init>":(Ljava/lang/String;I)V
49: putstatic #32; //Field THURSDAY:LDaysOfTheWeek;
52: new #1; //class DaysOfTheWeek
55: dup
56: ldc #34; //String FRIDAY
58: iconst_4
59: invokespecial #19; //Method "<init>":(Ljava/lang/String;I)V
62: putstatic #35; //Field FRIDAY:LDaysOfTheWeek;
65: new #1; //class DaysOfTheWeek
68: dup
69: ldc #37; //String SATURDAY
71: iconst_5
72: invokespecial #19; //Method "<init>":(Ljava/lang/String;I)V
75: putstatic #38; //Field SATURDAY:LDaysOfTheWeek;
78: new #1; //class DaysOfTheWeek
81: dup
82: ldc #40; //String SUNDAY
84: bipush 6
86: invokespecial #19; //Method "<init>":(Ljava/lang/String;I)V
89: putstatic #41; //Field SUNDAY:LDaysOfTheWeek;
92: bipush 7
94: anewarray #1; //class DaysOfTheWeek
97: dup
98: iconst_0
99: getstatic #23; //Field MONDAY:LDaysOfTheWeek;
102: aastore
103: dup
104: iconst_1
105: getstatic #26; //Field TUESDAY:LDaysOfTheWeek;
108: aastore
109: dup
110: iconst_2
111: getstatic #29; //Field WEDNESDAY:LDaysOfTheWeek;
114: aastore
115: dup
116: iconst_3
117: getstatic #32; //Field THURSDAY:LDaysOfTheWeek;
120: aastore
121: dup
122: iconst_4
123: getstatic #35; //Field FRIDAY:LDaysOfTheWeek;
126: aastore
127: dup
128: iconst_5
129: getstatic #38; //Field SATURDAY:LDaysOfTheWeek;
132: aastore
133: dup
134: bipush 6
136: getstatic #41; //Field SUNDAY:LDaysOfTheWeek;
139: aastore
140: putstatic #43; //Field ENUM$VALUES:[LDaysOfTheWeek;
143: return
public static DaysOfTheWeek[] values();
Code:
0: getstatic #43; //Field ENUM$VALUES:[LDaysOfTheWeek;
3: dup
4: astore_0
5: iconst_0
6: aload_0
7: arraylength
8: dup
9: istore_1
10: anewarray #1; //class DaysOfTheWeek
13: dup
14: astore_2
15: iconst_0
16: iload_1
17: invokestatic #51; //Method java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V
20: aload_2
21: areturn
public static DaysOfTheWeek valueOf(java.lang.String);
Code:
0: ldc #1; //class DaysOfTheWeek
2: aload_0
3: invokestatic #59; //Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
6: checkcast #1; //class DaysOfTheWeek
9: areturn
}
Les valeurs () code> font partie de la définition du type code> Enum code>. Ne pas confondre avec la classe de base code> Enum code>. La définition formelle est dans le Section 8.9 de la JLS a> qui spécifie la commande renvoyée correspond à la commande dans laquelle ils sont déclarés. p>
Parfait, c'est ce que j'ai supposé continuer. Merci!
Je vais ajouter à la réponse de Devon, que la méthode Le compilateur ajoute automatiquement certains
méthodes spéciales quand il crée un
Enum. Par exemple, ils ont une statique
Méthode de valeurs qui renvoie un tableau
contenant toutes les valeurs de la
Enum dans l'ordre, ils sont déclarés. P>
blockQuote> valeurs code> est ajoutée par le compilateur, par définition.
De l'ENUMS Tutoriel : P>
Si vous vous souciez beaucoup, cela signifie probablement que quelque chose va briser si dans votre déclaration d'énorme, vous déplacez des trucs. C'est juste vraiment fragile. Donc, je dirais que si vous vous souciez, vous avez probablement un design étrange. Pourquoi cela compte-t-il pour vous qu'ils sont en ordre?
@Mark Peters - parce que j'utilise Enums pour des éléments de menu commandés dans plusieurs endroits. Bien sûr, je pourrais créer une sorte de fonction de commande qui les a renvoyées dans une commande ... mais pourquoi? Cela ne se brisera pas si je les déplace, cela changera simplement la commande qu'ils sont présentées dans l'application.