In Java können Sie eine Aufzählung wie folgt erstellen:
public enum Letter {
A, B, C, D, E, F, G;
static {
for(Letter letter : values()) {
// do something with letter
}
}
}
Diese Frage betrifft die Methode "values ()". Wie wird es konkret umgesetzt? Normalerweise könnte ich mit F3 oder STRG + Klicken in Eclipse zur Quelle für Java-Klassen springen (auch für Klassen wie String, Character, Integer und sogar Enum). Es ist möglich, die Quelle der anderen Aufzählungsmethoden anzuzeigen (z. B. valueOf (String)).
Erstellt "values ()" bei jedem Aufruf ein neues Array? Wenn ich es einer lokalen Variablen zuweise und dann eines der Elemente ändere, was passiert (dies hat natürlich keinen Einfluss auf den von values () zurückgegebenen Wert, was bedeutet, dass jedes Mal ein neues Array zugewiesen wird).
Ist der Code dafür nativ? Oder behandelt die JVM / der Compiler sie speziell und gibt nur dann eine neue Instanz von values () zurück, wenn sie nicht nachweisen kann, dass sie nicht geändert wird.
synthetic
.values()
methodiertclone()
das Array$VALUES
? Warum nicht einfach direkt zurücksenden?-XD-printflat
. Sehr nützlich, um die internen Abläufe solcher Dinge zu verstehen. Schade, dass dieses Ding nicht besser dokumentiert ist. Danke, dass du mich darauf aufmerksam gemacht hast!Wenn Sie es einer lokalen Variablen zuweisen, können Sie dieser Variablen nur eine andere Aufzählung zuweisen. Dadurch wird die Aufzählung selbst nicht geändert, da Sie nur das Objekt ändern, auf das Ihre Variablen verweisen.
Es scheint, dass die Aufzählungen tatsächlich Singletons sind, so dass nur ein Element aus jeder Aufzählung in Ihrem gesamten Programm vorhanden sein kann. Dies macht den Operator == für Aufzählungen legal.
Es gibt also kein Leistungsproblem und Sie können nicht versehentlich etwas in Ihrer Aufzählungsdefinition ändern.
quelle
1) Nein. Oder zumindest nicht in aktuellen Implementierungen. Siehe @ lucasmos Antwort für die Beweise.
2) AFAIK, Nr.
Hypothetisch könnte es dies tun. Der Nachweis, dass ein Array niemals lokal modifiziert wird, wäre jedoch kompliziert und für die JIT relativ teuer. Wenn das Array der aufgerufenen Methode "entgeht"
values()
, wird es komplexer und teurer.Die Chancen stehen gut, dass sich diese (hypothetische) Optimierung nicht auszahlt ... wenn sie über den gesamten Java-Code gemittelt wird.
Das andere Problem ist, dass diese (hypothetische) Optimierung Sicherheitslücken öffnen kann.
Das Interessante ist jedoch, dass das JLS nicht anzugeben scheint, dass das
values()
Mitglied eine Array-Kopie zurückgibt. Der gesunde Menschenverstand 1 sagt, dass es tun muss ... aber es ist nicht wirklich spezifiziert.1 - Es wäre eine klaffende Sicherheitslücke, wenn
values()
ein gemeinsames (veränderliches) Array vonenum
Werten zurückgegeben würde.quelle