La syntaxe de sucre fournie par le service enum
de Java peut parfois être un peu déroutante. Considérons cet exemple, qui ne compile pas:Contexte statique dans la définition enum
public enum TestEnum {
FOO("foo") {
public void foo() {
helper(); // <- compiler error
}
};
String name;
TestEnum(String name) {
this.name = name;
}
public abstract void foo();
private void helper(){
// do stuff (using this.name, so must not be static)
}
}
Quelqu'un peut-il expliquer pourquoi le compilateur dit
méthode non-statique 'aide()' ne peut pas être référencé à partir d'un contexte statique
Comment exactement ce contexte est-il statique?
Vous pouvez faire cette compilation en changeant l'appel à this.
helper()
(ici est un point confus: si nous sommes vraiment dans un « contexte statique » comme le compilateur indique, comment peut « this
» travail) ou par augmenter la visibilité de helper()
au niveau par défaut. Lequel préférez-vous? Aussi, n'hésitez pas à suggérer un meilleur titre de la question :-)
Modifier: J'ai trouvé some discussion about this - mais pas de vraies réponses. Mon collègue pense que le fait que cette this.helper()
fonctionne est en fait un bogue du compilateur. Et en effet avec les versions plus récentes de Java, il semble pas de travailler (bien que super.helper()
fait): "ne peut pas trouver le symbole helper()". (Bien qu'il y ait quelque chose d'étrange: après avoir essayé avec différentes versions de Java je ne peux pas obtenir this.helper()
pour compiler à nouveau avec l'un d'eux ...)
J'ai le livre; quel puzzle veux-tu dire? (Je ne pouvais pas le trouver rapidement.) – Jonik
Mes deux exemplaires du livre sont emballés dans des boîtes quelque part, donc je n'en ai aucune idée. –