Variables d'instance finale statiques Java Enum
Huzzah!
Ce code a fonctionné pendant un moment, puis j'ai décidé d'ajouter une couleur par défaut, et il a cessé de travailler. J'obtiens l'erreur suivante:
1 error found:
File: Status.java [line: 20]
Error: Status.java:20: illegal reference to static field from initializer
Avec le code suivant au moment de la compilation.
import java.awt.Color;
enum Status
{
OFF ("Off"),
TRAINING ("Training", new Color(255, 191, 128)),
BEGINNER ("Beginner", new Color(128, 255, 138)),
INTERMEDIATE ("Intermediate", new Color(128, 212, 255)),
ADVANCED ("Advanced", new Color(255, 128, 128));
public final String name;
public final Color color;
public static final Color defaultColor = Color.WHITE;
Status(String name)
{
this(name, defaultColor);
}
Status(String name, Color color)
{
this.name = name;
this.color = color;
}
}
Cela devrait fonctionner, aussi loin que je peux dire, mais pour quelque raison que ce soit Java a décidé de lever une erreur.
Toutes les pensées?
source d'informationauteur skeggse
Vous devez vous connecter pour publier un commentaire.
defaultColor
ne seront initialisés après les constructeurs ont été appelés - alors il aura sa valeur par défaut (null) jusqu'à ce que le temps. Une option serait de mettre de la couleur par défaut dans une étude de type:Bien sûr, si vous êtes seulement en se référant à la couleur par défaut une fois dans le code, vous pourriez aussi bien coder en dur à l'intérieur de l'appel du constructeur:
L'enum constantes doivent être initialisé en premier. Pour les initialiser, les constructeurs doivent être appelés. Le premier constructeur fait référence à un champ statique qui n'auraient pas pu être initialisé au moment où elle est appelée.
Java permet cette
Bien sûr il vous avez un problème lors de l'exécution, mais Java n'a pas de soins. C'est le travail du programmeur pour organiser init séquences, et il n'est pas facile pour le compilateur de vérifier tout cassé init dépendances. Le problème est facile à résoudre de toute façon:
Mais pour
enum
cette solution ne s'applique pas, parce que les champs statiques dans unenum
type de ne peut pas être déplacé avant enums eux-mêmes (probablement pour le pur syntaxique raison). Pour éviter toute confusion, Java ajoute une restriction supplémentaire pourenum
- champs statiques ne peuvent pas être référencées à partir de constructeur.Cette restriction est foireuse. Il n'est pas facile (voire impossible) pour vérifier toutes les utilisations possibles des champs statiques de constructeur. Le code suivant devrait compiler, en battant la restriction:
Discussion et Solution de contournement Possible