8
votes

D'où viennent d'où entendre.values ​​()?

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 ​​").

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: xxx

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?


2 commentaires

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.


4 Réponses :


1
votes

4 commentaires

frisson 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 sont maintenant oracle.com . 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.



2
votes

Comme vous pouvez le constater à partir du bytecode ci-dessous obtenu en désassemblant une énumération, la méthode 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.

jouroftheweek.java strong> p>

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

}


0 commentaires

13
votes

Les valeurs () font partie de la définition du type Enum . Ne pas confondre avec la classe de base Enum . La définition formelle est dans le Section 8.9 de la JLS qui spécifie la commande renvoyée correspond à la commande dans laquelle ils sont déclarés.


1 commentaires

Parfait, c'est ce que j'ai supposé continuer. Merci!



1
votes

Je vais ajouter à la réponse de Devon, que la méthode valeurs est ajoutée par le compilateur, par définition.
De l'ENUMS
Tutoriel :

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.


0 commentaires