Woher kommt Enum.values ​​()?

8

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?

    
DougW 06.10.2010, 19:36
quelle

4 Antworten

13

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.

    
Devon_C_Miller 06.10.2010, 20:16
quelle
2

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.

%Vor%     
Abhinav Sarkar 06.10.2010 20:16
quelle
1

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.

    
Yoni 06.10.2010 20:48
quelle
1

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:

%Vor%

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.

    
Buhake Sindi 06.10.2010 20:07
quelle

Tags und Links