Warum kann der Konstruktor von enum nicht auf statische Felder und Methoden zugreifen? Dies gilt für eine Klasse, ist jedoch für eine Aufzählung nicht zulässig.
Ich versuche, meine Enum-Instanzen in einer statischen Map zu speichern. Betrachten Sie diesen Beispielcode, der die Suche nach Abkürzungen ermöglicht:
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);
}
}
Dies funktioniert nicht, da enum keine statischen Referenzen in seinem Konstruktor zulässt. Es funktioniert jedoch nur, wenn es als Klasse implementiert ist:
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
}
final
). Ich denke, das wird schwer zu fangen sein!EnumSet.allOf
anstelle von verwendenEnum.values()
? Ich frage, weilvalues
es eine ArtEnum.class
Enum.values()
schneller zu sein, wenn Sie vorhaben, sie mit einer erweiterten for-Schleife zu durchlaufen (da sie ein Array zurückgibt), aber hauptsächlich geht es um Stil und Anwendungsfall. Es ist wahrscheinlich besser zu verwenden,EnumSet.allOf()
wenn Sie Code schreiben möchten, der in der Java-Dokumentation vorhanden ist, anstatt nur in den Spezifikationen, aber viele Leute scheinenEnum.values()
sowieso damit vertraut zu sein.Zitat aus JLS, Abschnitt "Enum Body Declarations" :
quelle
Vielleicht ist es das, was du willst
quelle
Collections.unmodifiableMap()
ist hier eine sehr gute Praxis. +1Das Problem wurde über eine verschachtelte Klasse gelöst. Vorteile: Es ist kürzer und auch besser durch den CPU-Verbrauch. Nachteile: eine weitere Klasse im JVM-Speicher.
quelle
Wenn eine Klasse in die JVM geladen wird, werden statische Felder in der Reihenfolge initialisiert, in der sie im Code angezeigt werden. Zum Beispiel
Die Ausgabe ist 0. Beachten Sie, dass die Initialisierung von Test4 im statischen Initialisierungsprozess stattfindet und während dieser Zeit j noch nicht initialisiert ist, wie es später erscheint. Wenn wir nun die Reihenfolge der statischen Initialisierer so ändern, dass j vor test4 steht. Die Ausgabe ist 6.Aber bei Enums können wir die Reihenfolge der statischen Felder nicht ändern. Das erste, was in enum steht, müssen die Konstanten sein, die tatsächlich statische Endinstanzen des Aufzählungstyps sind. Daher wird für Aufzählungen immer garantiert, dass statische Felder nicht vor Aufzählungskonstanten initialisiert werden. Da wir statischen Feldern keine sinnvollen Werte für die Verwendung im Aufzählungskonstruktor geben können Es wäre sinnlos, im Enum-Konstruktor auf sie zuzugreifen.
quelle