Ich habe die Dokumentation und den Quellcode durchgesehen, weil ich sicher sein wollte, dass values () immer ein Array in der Reihenfolge zurückgibt, in der die Enum-Werte deklariert sind. Es stellt sich heraus, dass es nicht in der Dokumentation ist, soweit ich das beurteilen kann.
Ich habe den Quellcode für die Enum-Klasse überprüft und kein Glück ( dort ist ein verwandte, private "getValues" -Methode ).
Ich vermute also, dass ein Compiler / Interpreter-foo bereits eine Klasse erstellt, die Enum aus einer Deklaration wie folgt erweitert:
%Vor%Werden Werte () während der Kompilierung auch statisch in ein hartkodiertes Array übersetzt? Oder ist es tatsächlich eine Methode zur Laufzeit aufgerufen, und wenn ja, wo ist es definiert?
Die Methode values()
ist Teil der Definition des Typs enum
. Nicht zu verwechseln mit der Basisklasse Enum
. Die formale Definition ist im Abschnitt 8.9 der JLS angegeben Die zurückgegebene Reihenfolge stimmt mit der Reihenfolge überein, in der sie deklariert sind.
Wie Sie aus dem Bytecode sehen können, der durch Zerlegen einer Enumeration erhalten wurde, gibt die values()
-Methode für die 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 gefüllt.
DaysOfTheWeek.java
%Vor%DaysOfTheWeek.java wurde auseinandergebaut
Nach dem statischen Block initialisiert der Bytecode 0-92 die Enum-Konstanten, der Bytecode 94-139 setzt diese Konstanten in ein Array und der 140 markierte Bytecode weist das Array dem statischen% ENUM$VALUES
-Feld der Klasse zu. Der Code in der Methode values()
erstellt einfach eine Kopie des Arrays, das dem Feld ENUM$VALUES
zugewiesen ist, indem er System.arraycopy
aufruft und die Kopie zurückgibt.
Ich füge Devon's Antwort hinzu, dass die values()
-Methode per Definition vom Compiler hinzugefügt wird.
Aus dem enums Tutorial :
Der Compiler fügt automatisch einige hinzu spezielle Methoden, wenn es erstellt wird enum. Zum Beispiel haben sie eine statische values-Methode, die ein Array zurückgibt enthält alle Werte der Aufzählung in der Reihenfolge, in der sie deklariert sind.
Ihr Link, den Sie angegeben haben (wo es eine private getValues
-Methode gibt), stammt von Apache Harmony (Version 6, eine offene Version) Quelle Java SE). Sie haben eine andere Implementierung als die Enum
-Klasse von Oracle (die keine private getValues
-Methode hat).
Das Oracle Java (Version 1.6.0-21 zum Zeitpunkt des Schreibens) hat valueOf(Class<T> enumType, String name)
. Hier ist seine Implementierung:
Im Wesentlichen ist es so, dass Apache ihre valueOf
anders implementiert hat.
Enum
(oder enum
) haben eine öffentliche statische Methode mit dem Namen values()
, die die Konstanten der aufgezählten Werte zurückgibt, die in enum
deklariert sind. Das wird vom Compiler ausgefüllt.