Pourquoi le constructeur d'énumération ne peut-il pas accéder aux champs et méthodes statiques? Ceci est parfaitement valable avec une classe, mais n'est pas autorisé avec une énumération.
Ce que j'essaie de faire est de stocker mes instances enum dans une carte statique. Considérez cet exemple de code qui permet la recherche par abréviation:
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);
}
}
Cela ne fonctionnera pas car enum n'autorise pas les références statiques dans son constructeur. Cela fonctionne cependant juste trouver s'il est implémenté en tant que classe:
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
). Je suppose que ce sera difficile à attraper!EnumSet.allOf
place deEnum.values()
? Je demande parce quevalues
c'est une sorte de méthode fantôme (Enum.class
je ne peux pas voir la source ) et je ne sais pas quand elle a été crééeEnum.values()
soit plus rapide si vous prévoyez de les parcourir avec une boucle for améliorée (car elle renvoie un tableau), mais il s'agit principalement du style et du cas d'utilisation. Il est probablement préférable de l'utiliserEnumSet.allOf()
si vous souhaitez écrire du code qui existe dans la documentation de Java plutôt que dans les spécifications, mais de nombreuses personnes semblent le connaître deEnum.values()
toute façon.Citation de JLS, section "Enum Body Declarations" :
la source
c'est peut-être ce que tu veux
la source
Collections.unmodifiableMap()
est ici une très bonne pratique. +1Le problème est résolu via une classe imbriquée. Avantages: il est plus court et meilleur par la consommation du processeur. Inconvénients: une classe de plus dans la mémoire JVM.
la source
Lorsqu'une classe est chargée dans la JVM, les champs statiques sont initialisés dans l'ordre dans lequel ils apparaissent dans le code. Pour par exemple
La sortie sera 0. Notez que l'initialisation de test4 a lieu dans le processus d'initialisation statique et pendant ce temps j n'est pas encore initialisé comme il apparaîtra plus tard. Maintenant, si nous changeons l'ordre des initialiseurs statiques tels que j précède test4. La sortie sera 6.Mais dans le cas des Enums, nous ne pouvons pas modifier l'ordre des champs statiques. La première chose dans enum doit être les constantes qui sont en fait des instances finales statiques de type enum. , il serait inutile d'y accéder dans le constructeur enum.
la source