Je n'arrive pas à accéder aux membres d'instance de la classe environnante depuis l'intérieur d'une énumération, comme je le pourrais depuis l'intérieur d'une classe interne. Cela signifie-t-il que les énumérations sont statiques? Y a-t-il un accès à la portée de l'instance de la classe environnante, ou dois-je passer l'instance dans la méthode enum là où j'en ai besoin?
public class Universe {
public final int theAnswer;
public enum Planet {
// ...
EARTH(...);
// ...
// ... constructor etc.
public int deepThought() {
// -> "No enclosing instance of type 'Universe' is accessible in this scope"
return Universe.this.theAnswer;
}
}
public Universe(int locallyUniversalAnswer) {
this.theAnswer = locallyUniversalAnswer;
}
}
Réponses:
Oui, les énumérations imbriquées sont implicitement statiques.
De la section 8.9 de spécification de langue :
la source
Cela n'aurait pas de sens de créer une classe d'énumération interne au niveau de l'instance (non statique) - si les instances d'énumération étaient elles-mêmes liées à la classe externe, elles briseraient la garantie d'énumération -
par exemple si vous aviez
Pour que les valeurs d'énumération agissent correctement comme des constantes, (psuedocode, ignorant les restrictions d'accès)
b1 et b2 devraient être les mêmes objets.
la source