Von woher kommt Enum.values ​​()?

Ich schaute durch die Dokumentation und den Quellcode, denn ich wollte sicher sein, dass Werte () immer ein Array in der Reihenfolge zurückgeben würden, in der die Enum-Werte deklariert sind. Stellt sich heraus, es ist nicht in der Dokumentation so weit wie ich sagen kann.

Ich habe den Quellcode für die Enum-Klasse überprüft und kein Glück ( es gibt eine verwandte, private "getValues" -Methode ).

  • Android GCM Grundlegende Implementierung
  • Android - Wie man Absicht von JavaScript ausführt
  • Einstellung ActionBarSherlock Theme für Android App
  • Warum wird ein mit der Kamera-Intention aufgenommenes Bild auf einigen Geräten auf Android gedreht?
  • Wie kann ich verhindern, dass ein EditText sich selbst verändert, wenn der Benutzer eintippt?
  • GSON & Realm gut machen
  • Also vermute ich, dass ein Compiler / Interpreter-Foo bereits eine Klasse kreiert, die Enum aus einer Deklaration erweitert wie:

    public static enum MyEnum 

    Also sind Werte () auch statisch in ein Hardcoded Array während der Kompilierung übersetzt? Oder ist es eigentlich eine Methode zur Laufzeit genannt, und wenn ja, wo ist es definiert?

  • "Java.lang.IllegalStateException: Kann nicht aufgerufen werden, um ein Ergebnis zu liefern"
  • Wie kann ich ein importiertes Modul in Android Studio aktualisieren?
  • So ändern Sie Hintergrundfarbe Popup-Menü Android
  • MySQL - Kombinieren von INSERT, VALUES und SELECT?
  • Wie bekomme ich eine Android-Widget-Größe, nachdem das Layout berechnet wurde?
  • Wie bekommst du EditText-Wert und zeig es auf dem Bildschirm durch TextView?
  • 4 Solutions collect form web for “Von woher kommt Enum.values ​​()?”

    Die Methode enum values() ist Teil der Definition des enum Typs. Nicht mit der Enum Basisklasse verwechselt werden. Die formale Definition ist in Abschnitt 8.9 der JLS, die die Bestellung angeben, entspricht der Reihenfolge, in der sie deklariert sind.

    Wie Sie aus dem unten stehenden Bytecode sehen können, indem Sie ein Enum auflösen, geben die values() -Methode auf den Enums einfach eine Kopie des private static Arrays zurück, das alle deklarierten Enum-Konstanten enthält. Dieses Array ENUM$VALUES wird in einem statischen Initialisierungsblock ausgefüllt.

    DaysOfTheWeek.java

     public enum DaysOfTheWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } 

    DaysOfTheWeek.java zerlegt

    Nach dem statischen Block initialisiert der mit 0-92 markierte Bytecode die Enum-Konstanten, der mit 94-139 markierte Bytecode setzt diese Konstanten in ein Array und der mit 140 gekennzeichnete Bytecode ordnet das Array dem ENUM$VALUES der Klasse zu. Der Code in der Methode values() erstellt einfach eine Kopie des Arrays, die dem Feld ENUM$VALUES ist, indem sie System.arraycopy und die Kopie zurückgibt.

     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 } 

    Ich werde Devons Antwort hinzufügen, dass die values() -Methode vom Compiler per Definition hinzugefügt wird.
    Aus dem Enums- Tutorial :

    Der Compiler fügt automatisch einige spezielle Methoden hinzu, wenn er ein Enum erzeugt. Zum Beispiel haben sie eine statische Wertmethode, die ein Array zurückgibt, das alle Werte des Enums in der Reihenfolge enthält, in der sie deklariert sind.

    Ihr Link, den Sie zur Verfügung stellen (wo es eine private getValues Methode gibt) ist von Apache Harmony (Version 6, die eine Open Source Java SE ist). Sie haben eine andere Implementierung zu Oracle's Enum Klasse (die keine private getValues Methode hat).

    Der Oracle Java (Version 1.6.0-21 zum Zeitpunkt des Schreibens) hat den valueOf(Class<T> enumType, String name) . Hier ist seine Umsetzung:

      /** * Returns the enum constant of the specified enum type with the * specified name. The name must match exactly an identifier used * to declare an enum constant in this type. (Extraneous whitespace * characters are not permitted.) * * @param enumType the <tt>Class</tt> object of the enum type from which * to return a constant * @param name the name of the constant to return * @return the enum constant of the specified enum type with the * specified name * @throws IllegalArgumentException if the specified enum type has * no constant with the specified name, or the specified * class object does not represent an enum type * @throws NullPointerException if <tt>enumType</tt> or <tt>name</tt> * is null * @since 1.5 */ public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) { T result = enumType.enumConstantDirectory().get(name); if (result != null) return result; if (name == null) throw new NullPointerException("Name is null"); throw new IllegalArgumentException( "No enum const " + enumType +"." + name); } 

    Im Wesentlichen ist es so, wie Apache ihren valueOf Das ist anders.


    Enum (oder enum ) haben eine öffentliche statische Methode namens values() , die die aufgezählten Werte Konstanten, die innerhalb des enum deklariert, zurückgibt. Das wird vom Compiler bevölkert.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.