Ich verstehe, warum ein Enum-Konstruktor nicht auf statische Felder und Methoden innerhalb der Enumeration selbst zugreifen kann, und warum das gleiche für für in Klassen zulässig ist. Du für ein Beispiel des folgenden Code,Private Enums und statische Felder in der umschließenden Klasse
import java.util.ArrayList;
import java.util.List;
public enum Foo {
A("Some string"),
B("Some other string"),
;
static List<String> list = new ArrayList<>();
Foo(String description) {
list.add(description);
}
}
Dieser Code führt zu einem Fehler bei der Kompilierung, illegal reference to static field from initializer
.
Relevante Hintergrund
Der Enum-Konstruktor aufgerufen wird, bevor die statische Felder haben alle initialisiert. Im obigen Beispiel bedeutet dies, dass list
noch nicht initialisiert ist. Dies liegt daran, statische Felder in Text Reihenfolge (section 12.4.2)
Als nächstes ausführen entweder die Klassen Variableninitialisierungen und statische initializers der Klasse initialisiert werden, oder das Feld initializers die Schnittstelle, in textlichen Reihenfolge, wie obwohl sie ein einzelner Block waren.
(Hervorhebung von mir)
und da die ENUM-Werte sich immer alle anderen Felder vorausgehen, einschließlich der statischen Felder, sie sind an den Enum-Konstruktor nicht verfügbar, dh es werden keine statischen Felder der Enum vorausgehen kann Werte A
und B
.
Frage
Allerdings, und hier ist meine Frage, warum ist es, dass ein „privater“ (innerhalb einer Klasse eingeschlossen) enum
statische Felder der umgebenden Klasse zugreifen kann, unabhängig davon, ob die Enum erscheint vor --- oder --- nach den statischen Feldern? Insbesondere wo ist das in der Java-Spezifikation spezifiziert?
Siehe unten stehenden Code als Referenz
import java.util.ArrayList;
import java.util.List;
public class Bar {
static List<String> first = new ArrayList<>();
enum Baz {
A("Some string"),
B("Some other string"),
;
Baz(String description) {
// Can access static fields from before the enum
first.add(description);
// Can access static fields from _after_ the enum
second.add(description);
}
}
static List<String> second = new ArrayList<>();
}
Interessante Frage. Ich bin mir nicht sicher, ob die Annahme, dass der Konstruktor vor der Initialisierung statischer Felder aufgerufen wird, korrekt ist. Ich denke, es ist eher das Gegenteil. Sortierung: http://stackoverflow.com/questions/36407743/enum-based-table-matrix-in-java –
@SotiriosDelimanolis eigentlich die Liste der Enum-Konstanten ist mehr oder weniger eine Liste der Objekte, die mit dem Enum-Konstruktor erstellt wurden. –
@SotiriosDelimanolis Beispiele wurden zur Verfügung gestellt, danke. Und Entschuldigung. –