Warum kann der Konstruktor von enum nicht auf statische Felder zugreifen?
Warum kann nicht enum-Konstruktor Zugriff auf statische Felder und Methoden? Dies ist vollkommen gültig mit einer Klasse, darf jedoch nicht mit einem enum.
Was ich versuche zu tun, ist meine enum-Instanzen in einer statischen Karte. Betrachten Sie das folgende Beispiel-code, das ermöglicht die Suche nach abbreivation:
public enum Day {
Sunday("Sun"), Monday("Mon"), Tuesday("Tue"), Wednesday("Wed"), Thursday("Thu"), Friday("Fri"), Saturday("Sat");
private final String abbreviation;
private static final Map<String, Day> ABBREV_MAP = new HashMap<String, Day>();
private Day(String abbreviation) {
this.abbreviation = abbreviation;
ABBREV_MAP.put(abbreviation, this); //Not valid
}
public String getAbbreviation() {
return abbreviation;
}
public static Day getByAbbreviation(String abbreviation) {
return ABBREV_MAP.get(abbreviation);
}
}
Diese wird nicht als enum erlaubt keine statische Referenz in den Konstruktor. Es jedoch funktioniert nur finden, wenn Sie umgesetzt werden, wie eine Klasse:
public static final Day SUNDAY = new Day("Sunday", "Sun");
private Day(String name, String abbreviation) {
this.name = name;
this.abbreviation = abbreviation;
ABBREV_MAP.put(abbreviation, this); //Valid
}
InformationsquelleAutor der Frage Steve Kuo | 2009-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konstruktor wird aufgerufen, bevor die statischen Felder wurden initialisiert, da die statische Felder (darunter die Vertreter der enum-Werten) initialisiert in textueller Reihenfolge, und die enum-Werte kommen immer vor den anderen Bereichen. Beachten Sie, dass in Ihrer Klasse B. Sie haben nicht gezeigt, wo ABBREV_MAP initialisiert wird - wenn es nach SONNTAG, erhalten Sie eine Ausnahme aus, wenn die Klasse initialisiert wird.
Ja, es ist ein bisschen Schmerz und könnte wahrscheinlich besser entwickelt haben.
Jedoch die übliche Antwort ist in meiner Erfahrung eine
static {}
block am Ende alle statischen Initialisierungen, und alles tun, statische Initialisierung ist es, mitEnumSet.allOf
um auf alle Werte.InformationsquelleAutor der Antwort Jon Skeet
Zitat von JLS, Abschnitt "Enum-Body-Deklarationen":
InformationsquelleAutor der Antwort Phani
vielleicht ist dies, was Sie wollen
InformationsquelleAutor der Antwort user4767902
Ist das problem gelöst über eine geschachtelte Klasse. Pros: es ist kürzer und auch besser durch den CPU-Verbrauch. Nachteile: eine weitere Klasse in die JVM-Speicher.
InformationsquelleAutor der Antwort Pavel Vlasov
Wenn eine Klasse geladen wird in die JVM, die dann die statischen Felder initialisiert werden, in der Reihenfolge, in der Sie im code. Für z.B.
Ist die Ausgabe 0. Beachten Sie, dass test4 Initialisierung erfolgt in statische Initialisierung und während dieser Zeit j ist noch nicht initialisiert, wie es scheint, später. Wenn wir nun wechseln, um von statischen Initialisierungen, so dass j kommt vor test4. Die Ausgabe wird 6.Aber im Falle von Enums, die wir nicht verändern können, um von statischen Feldern. Die erste Sache, die in enum müssen die Konstanten sind eigentlich static final Instanzen der enum-Typ.Also für enums ist es immer gewährleistet, dass statische Felder nicht initialisiert werden, bevor enum-Konstanten.Da wir Sie nicht geben, jeder vernünftige Werte für statische Felder für den Einsatz in enum-Konstruktor, wäre es sinnlos, auf Sie zuzugreifen, die in enum-Konstruktor.
InformationsquelleAutor der Antwort Hitesh